您的位置:首页 > 其它

Gson通过借助TypeToken获取泛型参数的类型的方法

2016-11-24 11:13 579 查看
this.multiMedia = StringUtils.isBlank(map.get("multimedia")) ? null
: new Gson().fromJson(map.get("multimedia"), new TypeToken<List<GroupIdModel>>() {
}.getType());


由于Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型)。

但是有的时候,我们确实需要获知泛型参数的类型,比如将使用了泛型的Java代码序列化或者反序列化的时候,这个时候问题就变得比较棘手。

?
2
4
6
8
class 
T value;

}
Gson gson = 
Gson();

Foo<Bar> foo = 
Foo<Bar>();

gson.toJson(foo); 
 

gson.fromJson(json, foo.getClass()); <code comments"="">// Fails to deserialize foo.value as Bar
 

对于上面的类Foo<T>,由于在运行期间无法得知T的具体类型,对这个类的对象进行序列化和反序列化都不能正常进行。Gson通过借助TypeToken类来解决这个问题。
public QuestShow(QuestShows questShows) {
sid = questShows.getSid();
question = questShows.getQuestion();
answer = questShows.getAnswer();
hint = questShows.getHint();
think = questShows.getThink();
QTDicPoint = questShows.getQTDicPoint();
QTDicFormular = questShows.getQTDicFormular();
practice = new Gson().fromJson(questShows.getPractice(), new TypeToken<List<Practice>>() {
}.getType());
knowledges = new Gson().fromJson(questShows.getKnowledges(), new TypeToken<List<Knowledge>>() {
}.getType());
videos = new Gson().fromJson(questShows.getVideos(), new TypeToken<Set<VideoInfo>>() {
}.getType());
diff = questShows.getDiff();
type = questShows.getType();
subject = questShows.getSubject();
section = questShows.getSection();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: