繁体   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