问题
我可以在GAE上序列化我的servlet中的List,但我不能反序列化它。我究竟做错了什么?
这是我在GAE中的视频类,它是序列化的:
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;
/**
* @param id
* @param titulo
* @param descricao
* @param 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;
}
}
这是我的其他应用程序中的类视频,我尝试反序列化:
package classes;
import java.util.Date;
public class Video {
private String id;
private String titulo;
private String descricao;
private Date date;
/**
* @param id
* @param titulo
* @param descricao
* @param 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;
}
}
#1 热门回答(269 赞)
有了Gson,你只需要做以下事情:
List<Video> videos = gson.fromJson(json, new TypeToken<List<Video>>(){}.getType());
你可能还需要在要反序列化的374142419class上提供无参数构造函数。
#2 热门回答(85 赞)
另一种方法是使用数组作为类型,例如:
Video[] videoArray = gson.fromJson(json, Video[].class);
这样你可以避免使用Type对象的所有麻烦,如果你真的需要一个列表,你总是可以将数组转换为一个列表,例如:
List<Video> videoList = Arrays.asList(videoArray);
恕我直言,这更具可读性。
#3 热门回答(7 赞)
试试这个单线
List<Video> videos = Arrays.asList(new Gson().fromJson(json, Video[].class));
参考:
- 方法数组#asList
- 构造函数Gson
- 方法Gson#fromJson(源json可以是JsonElement,Reader或String类型)
- 接口列表
- JLS - 数组
- JLS - 通用接口