概述,我有一个抽象类,其中有三个具体的类继承。
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,因为它的孩子可能有三种不同的类型;本身或其他两个具体的课程。我有一个工作的自定义序列化程序,如果所有子项都是相同的类型。不寻求完整的解决方案,高水平的方法或策略将是好的。谢谢。
答案 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}
如您所见,当a
,A
和B
被序列化时,摘要C
中的继承私有字段D
已正确序列化。