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

时间:2013-03-31 13:34:53

标签: java gson

我的护目镜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( )

那么如何为抽象类获得正确的输出呢?

3 个答案:

答案 0 :(得分:2)

如果是抽象类,则需要编写自己的适配器。有关该主题,请参阅this article

答案 1 :(得分:2)

查看代码,我可以看到Gson排除了匿名内部类。我得到的最好解释是因为Gson的哲学是支持对称序列化和反序列化,如this bug中所述:

  

不要使用双括号初始化。它阻止[de]序列化,Gson设计用于对称序列化和[de]序列化。

如果没有自定义,就无法对内部类进行反序列化。来自users guide

  

Gson也可以反序列化静态嵌套类。但是,Gson不能自动反序列化纯内部类,因为它们的no-args构造函数还需要对反序列化时不可用的包含Object的引用。

因此Gson阻止了序列化。你可以将匿名内部类改为静态嵌套类,它可以工作。

答案 2 :(得分:0)

对此感到抱歉,但是对于那些不想创建嵌套类的人,可以使用以下方法:

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

这对我来说很有效