Puedo serializar un List<Video>
en mi servlet en GAE, pero no puedo deserializarlo. ¿Qué estoy haciendo mal?
Este es mi video de clase en GAE, que está serializado:
package legiontube;
import java.util.Date;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Video {
@PrimaryKey
private String id;
@Persistent
private String titulo;
@Persistent
private String descricao;
@Persistent
private Date date;
public Video(){};
public Video(String id, String titulo, String descricao, Date date) {
//super();
this.id = id;
this.titulo = titulo;
this.descricao = descricao;
this.date = date;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
Este es mi video de clase en mi otra aplicación, donde trato de deserializar:
package classes;
import java.util.Date;
public class Video {
private String id;
private String titulo;
private String descricao;
private Date date;
public Video(String id, String titulo, String descricao, Date date) {
//super();
this.id = id;
this.titulo = titulo;
this.descricao = descricao;
this.date = date;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
Respuestas:
Con Gson, solo necesitaría hacer algo como:
Es posible que también deba proporcionar un constructor sin argumentos en la
Video
clase a la que está deserializando.fuente
TypeToken<List<Video>>
... es un truco que permite que el tipo resultante se representeList<Video>
, ya que las subclases de tipos genéricos completamente especificados retienen la información del tipo genérico.TypeToken
todavía estáprotected
en Gson 2.1, por lo que lo anterior aún debería funcionar.Otra forma es usar una matriz como tipo, por ejemplo:
De esta manera, evita todas las molestias con el objeto Type, y si realmente necesita una lista, siempre puede convertir la matriz en una lista, por ejemplo:
En mi humilde opinión, esto es mucho más legible.
En Kotlin, esto se ve así:
Para convertir esta matriz en Lista, solo use el
.toList()
métodofuente
Prueba este de una sola línea
Advertencia: la lista de
videos
devuelta porArrays.asList
es inmutable; no puede insertar nuevos valores.Referencia:
json
puede ser del tipoJsonElement
,Reader
oString
)fuente
Tenga cuidado al usar la respuesta proporcionada por @DevNG. Arrays.asList () devuelve la implementación interna de ArrayList que no implementa algunos métodos útiles como add (), delete (), etc. Si los llama, se lanzará una UnsupportedOperationException. Para obtener una instancia real de ArrayList, debe escribir algo como esto:
fuente