簡體   English   中英

使用 Gson 序列化抽象類返回 null

[英]Serialize abstract class with Gson returns null

我的護目鏡 Gson 庫有問題。 看下面的代碼:

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( )

那么如何獲得抽象類的正確輸出呢?

對於抽象類,您需要編寫自己的適配器。 請參閱有關該主題的這篇文章

查看代碼,我可以看到 Gson 排除了匿名內部類。 我有最好的解釋是因為 Gson 的哲學是支持對稱序列化和反序列化,正如這個 bug 中所解釋的:

不要使用雙括號初始化。 它可以防止 [反] 序列化,而 Gson 專為對稱序列化和 [反] 序列化而設計。

沒有定制就不可能反序列化內部類。 用戶指南

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

因此 Gson 阻止了序列化。 您可以將匿名內部類改為靜態嵌套類,它會起作用。

抱歉有點晚了,但對於那些不想創建嵌套類的人,您可以使用它:

AbstractPayload payload = new AbstractPayload("field") {};
String result = gson.toJson(payload, AbstractPayload.class)

這適用於我的情況

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM