Ich kann ein List<Video>
in meinem Servlet auf GAE serialisieren , aber ich kann es nicht deserialisieren. Was mache ich falsch?
Dies ist mein Klassenvideo in GAE, das serialisiert ist:
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;
}
}
Dies ist mein Klassenvideo in meiner anderen Anwendung, in der ich versuche zu deserialisieren:
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;
}
}
Antworten:
Mit Gson müssten Sie nur Folgendes tun:
Möglicherweise müssen Sie auch einen Konstruktor ohne Argumente für die
Video
Klasse angeben, für die Sie deserialisieren.quelle
TypeToken<List<Video>>
... erstellt. Dies ist ein Trick, mit dem der resultierende Typ dargestellt werden kannList<Video>
, da Unterklassen vollständig spezifizierter generischer Typen die generischen Typinformationen beibehalten.TypeToken
immer nochprotected
in Gson 2.1 ist, also sollte das Obige immer noch funktionieren.Eine andere Möglichkeit besteht darin, ein Array als Typ zu verwenden, z.
Auf diese Weise vermeiden Sie den Ärger mit dem Type-Objekt. Wenn Sie wirklich eine Liste benötigen, können Sie das Array jederzeit in eine Liste konvertieren, z.
IMHO ist dies viel besser lesbar.
In Kotlin sieht das so aus:
Verwenden Sie einfach die
.toList()
Methode, um dieses Array in List zu konvertierenquelle
Probieren Sie diesen Einzeiler
Warnung: Die von
videos
zurückgegebene ListeArrays.asList
ist unveränderlich - Sie können keine neuen Werte einfügen.Referenz:
json
des Typs sein kannJsonElement
,Reader
oderString
)quelle
Seien Sie vorsichtig mit der Antwort von @DevNG. Arrays.asList () gibt die interne Implementierung von ArrayList zurück, die einige nützliche Methoden wie add (), delete () usw. nicht implementiert. Wenn Sie sie aufrufen, wird eine UnsupportedOperationException ausgelöst. Um eine echte ArrayList-Instanz zu erhalten, müssen Sie Folgendes schreiben:
quelle