Eu posso serializar um List<Video>
no meu servlet no GAE, mas não posso desserializá-lo. O que estou fazendo de errado?
Esta é a minha classe Vídeo no GAE, que é serializada:
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;
}
}
Esta é a minha classe Video em meu outro aplicativo, onde tento desserializar:
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;
}
}
Respostas:
Com o Gson, você só precisa fazer algo como:
Você também pode precisar fornecer um construtor sem argumento na
Video
classe para a qual está desserializando.fonte
TypeToken<List<Video>>
... é um truque que permite que o tipo resultante representeList<Video>
, já que subclasses de tipos genéricos totalmente especificados retêm as informações do tipo genérico.TypeToken
ainda estáprotected
no Gson 2.1, portanto o que precede ainda deve funcionar.Outra maneira é usar uma matriz como um tipo, por exemplo:
Dessa forma, você evita todos os problemas com o objeto Type e, se realmente precisa de uma lista, pode sempre converter a matriz em uma lista, por exemplo:
IMHO isso é muito mais legível.
No Kotlin, é assim:
Para converter essa matriz em lista, basta usar o
.toList()
métodofonte
Experimente este one-liner
Aviso: a lista
videos
retornada porArrays.asList
é imutável - você não pode inserir novos valores.Referência:
json
pode ser do tipoJsonElement
,Reader
ouString
)fonte
Cuidado ao usar a resposta fornecida por @DevNG. Arrays.asList () retorna a implementação interna de ArrayList que não implementa alguns métodos úteis como add (), delete () etc. Se você os chamar, uma UnsupportedOperationException será lançada. Para obter uma instância real de ArrayList, você precisa escrever algo como isto:
fonte