Gson序列化多态对象列表

时间:2013-12-30 14:24:19

标签: gson

概述,我有一个抽象类,其中有三个具体的类继承。

public abstract class A {}

public class B extends A {}

public class C extends A {}

public class D extends A {
   private List<A> children;
 }

要点是具体的D类有一个列表,可以包含具体类B,C或D的对象。

我的挑战是如何序列化D,因为它的孩子可能有三种不同的类型;本身或其他两个具体的课程。我有一个工作的自定义序列化程序,如果所有子项都是相同的类型。不寻求完整的解决方案,高水平的方法或策略将是好的。谢谢。

2 个答案:

答案 0 :(得分:1)

看看https://stackoverflow.com/a/22081826/3315914。 有一个有效的例子。 您所需要的只是Gson's RuntimeTypeAdapterFactory。一个简单的例子可能是:

RuntimeTypeAdapter<Shape> shapeAdapter = RuntimeTypeAdapterFactory.of(Shape.class)
        .registerSubtype(Rectangle.class)
        .registerSubtype(Circle.class)
        .registerSubtype(Diamond.class);

然后,

Gson gson = new GsonBuilder()
       .registerTypeAdapter(Shape.class, shapeAdapter)
       .create();

另外,here您也可以找到类似的答案。

我希望它有所帮助。

答案 1 :(得分:0)

我非常怀疑你使用的是Gson的古老版本,或者你并没有准确解释问题所在。使用Gson的v2.2.4:

public class App
{
    public static void main(String[] args) 
    {          
        D d = new D();
        D d2 = new D();
        d.list.add(d2);
        System.out.println(new Gson().toJson(d));
    }
}

abstract class A
{
    private int a = 5;
}

class B extends A
{
    private int b = 6;
}

class C extends A
{
    private int c = 7;
}

class D extends A
{
    List<A> list = new ArrayList<A>();

    public D()
    {
        list.add(new B());
        list.add(new C());
    }
}

输出:

  

{ “列表”:[{ “B”:6, “一”:5},{ “C”:7, “一”:5},{ “列表”:[{ “B”:6, “一”:5},{ “C”:7, “一”:5}], “一”:5}], “一”:5}

如您所见,当aAB被序列化时,摘要C中的继承私有字段D已正确序列化。