2013-03-31 67 views
2

我有goggles Gson庫的問題。請看下面的代碼:使用Gson序列化抽象類返回null

public abstract class Main { 
    public String foo = "foo"; 
    public List<String> bar = Arrays.asList("foo", "bar"); 


    @Override 
    public String toString() { 
     Gson gson = new Gson(); 
     return gson.toJson(this); 
    } 

    public static void main(String[] args) { 
     Main main = new Main() { 
     }; 
     System.out.println(main.toString()); 
    } 
} 

它打印null。但是我希望它能打印{"foo":"foo","bar":["foo","bar"]},它在創建Main()後刪除抽象標識符和大括號。

那麼,我怎麼才能得到抽象類的正確輸出呢?

+0

你想要實例化一個抽象類嗎? – Atropo

+1

@Atropo是的,他使用匿名類來做到這一點。 –

+0

對不起,我沒有看到花括號 – Atropo

回答

2

如果是抽象類,則需要編寫自己的適配器。關於這個問題見this article

+0

當您試圖反序列化爲抽象類型時,這不僅適用於反序列化嗎? Gson反思你傳入的對象的類別,我認爲這不重要。 –

+0

它在某種意義上是對稱的:在序列化過程中,某些類型信息也需要保留,但由於toString只知道_static_抽象類型,所以它無法發揮它的魔力(可能有很多派生到這個類)。 *直接*在匿名類的創建的實例上調用gson.toJson()將工作:) –

2

看看代碼,我可以看到Gson排除了匿名內部類。我有最好的解釋是,因爲GSON的理念是支持對稱序列化和反序列化,如this bug解釋說:

不使用雙括號初始化。它阻止了[de]序列化,而Gson被設計用於對稱序列化和[de]序列化。

如果沒有自定義,就不可能反序列化內部類。從users guide

Gson也可以反序列化靜態嵌套類。但是,Gson不能自動反序列化純內部類,因爲它們的無參數構造函數也需要引用包含在反序列化時不可用的對象。

因此Gson阻止了序列化。您可以使匿名內部類變爲靜態嵌套類,它可以工作。

+0

我正在使用雙括號初始化,因此它不工作。 +1 – Gurpreet