Mogę serializować List<Video>
w moim serwlecie na GAE, ale nie mogę go deserializować. Co ja robię źle?
To jest wideo mojej klasy w GAE, które jest serializowane:
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;
}
}
To jest moja klasa wideo w mojej innej aplikacji, w której próbuję deserializować:
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;
}
}
Odpowiedzi:
W przypadku Gson wystarczy zrobić coś takiego:
Może być również konieczne podanie konstruktora bez argumentów dla
Video
klasy, do której deserializujesz.źródło
TypeToken<List<Video>>
... to sztuczka, która pozwala wynikowemu typowi reprezentowaćList<Video>
, ponieważ podklasy w pełni określonych typów ogólnych zachowują informacje o typie ogólnym.TypeToken
nadal jestprotected
w Gson 2.1, więc powyższe powinno nadal działać.Innym sposobem jest użycie tablicy jako typu, np:
W ten sposób unikniesz wszystkich kłopotów z obiektem Type, a jeśli naprawdę potrzebujesz listy, zawsze możesz przekonwertować tablicę na listę, np:
IMHO to jest znacznie bardziej czytelne.
W Kotlinie wygląda to tak:
Aby przekonwertować tę tablicę na List, po prostu użyj
.toList()
metody methodźródło
Wypróbuj tę jedną linijkę
Uwaga: lista
videos
zwrócona przezArrays.asList
jest niezmienna - nie można wstawiać nowych wartości.Odniesienie:
json
może być typuJsonElement
,Reader
lubString
)źródło
Uważaj, korzystając z odpowiedzi udzielonej przez @DevNG. Arrays.asList () zwraca wewnętrzną implementację ArrayList, która nie implementuje niektórych użytecznych metod, takich jak add (), delete () itp. Jeśli je wywołasz, zostanie wyrzucony wyjątek UnsupportedOperationException. Aby uzyskać prawdziwą instancję ArrayList, musisz napisać coś takiego:
źródło