我需要知道是否可以执行以下操作。我需要通过tcp传递一些对象。我选择使用Gson将它们转换为JSON。但是这个对象可以有不同的类型。主要是我:
public class NetMessage {
public int code;
public Object obj;
}
有code
和一个对象,它可以有不同的类类型。如何在转移到初始类型后重建我的对象?
测试:
public static void main(String[] args) {
Gsonizer gs = new Gsonizer();
Invoice v = new Invoice(123, 123, 10.1);
NetMessage nm = new NetMessage(2, v);
String s = (String) gs.toNet(nm);
NetMessage nm2 = (NetMessage) gs.fromNet(s);
System.out.println("> " +nm2.code);
System.out.println("> " +(Object)nm2.obj.getClass()); <<<<<<<< *
}
我的*
标记了一个完全不同的类型,它是来自Gson lib的内部类,它打印出来:
班com.google.gson.internal.LinkedTreeMap
我怎样才能实现我重建对象的初始类型。
编辑: Gson反序列化代码:
public Object fromNet(String obj){
return gsonizer.fromJson(obj, NetMessage.class);
}
答案 0 :(得分:1)
基本上,使用您的设置,这是不可能的。
Gson通过查看目标类型来执行反序列化。当该类型无关紧要时,它有一些默认值。对于Object
,该类型为LinkedTreeMap
。
鉴于
public class NetMessage {
public int code;
public Object obj;
}
和
return gsonizer.fromJson(obj, NetMessage.class);
您尚未指定如何对obj
字段进行反序列化。在这种情况下,Gson默认使用LinkedTreeMap
。
唯一的解决方案是明确指定obj
所需的类型。