2014-03-30 62 views
0

我需要知道是否可以執行以下操作。我需要通過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

向我們展示Gson反序列化代碼... –

+1

似乎仿製藥將符合法案。 'NetMessage '。 – aliteralmind

+0

有沒有反思的方法? –

回答

1

基本上,您的設置,這是不可能的。

Gson通過查看目標類型來執行其反序列化。它有一些默認值,當這種類型無關緊要時。在Object的情況下,該類型是LinkedTreeMap

鑑於

public class NetMessage { 
    public int code; 
    public Object obj; 
} 

return gsonizer.fromJson(obj, NetMessage.class); 

你沒有指定obj領域應如何反序列化。在這種情況下,Gson默認使用LinkedTreeMap

唯一的解決方案是明確指定obj所需的類型。

+0

如果我在包含類名的NM對象中添加字符串類型,該怎麼辦? Ty通過對默認類thingie –

+0

@BogdanM的洞察方式。我不相信Gson有一個內置的功能。你應該看看。其他JSON解析器_do_存在,可以基於JSON中的'class'字段進行反序列化。 –