有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用Gson将基类列表反序列化为派生类

我正在开发一款Android应用程序,它使用JSON与C#服务器进行通信

我有一个要序列化的数据类(实际上是将接收到的数据反序列化为),其中包含派生类的列表字段,但将它们存储为它们的基类:

public class ToSerializeClass{
    @SerializedName("TestString")
    private String testString = "TestStringValue";

    @SerializedName("DerivedClasses")
    private List<BaseClass> derivedClasses;

    public List<BaseClass> getDerivedClasses() {
        return derivedClasses;
    }

    public ToSerializeClass(List<BaseClass> derivedClasses){
        this.derivedClasses= derivedClasses;
    }
}

例如,如果我从C#端收到以下ToSerializeClass实例,称为serializeClass

List<BaseClass> derivedClasses = new ArrayList<>();
derivedClasses.add(new DerivedClassA());
derivedClasses.add(new DerivedClassB());
ToSerializeClass serializeClass = new ToSerializeClass(derivedClasses);

JSON字符串应该是:

{"__type":"ToSerializeClass","DerivedClasses":[{"__type":"DerivedA","FieldA":"This is a derived class."},{"__type":"DerivedB","FieldB":"This is ANOTHER derived class.", "IntValue":10}],"TestString":"TestStringValue"}

JSON字符串的“_type”:“SimpleClassName”字段显示序列化类的简单名称。这些是由C#side的序列化程序添加的。 如果必要的话,我可以让这些字段消失,但这是C#端同样问题的解决方案。 如果没有这些类型,它会是这样的:

{"DerivedClasses":[{"FieldA":"This is a derived class."},{"FieldB":"This is ANOTHER derived class.", "IntValue":10}],"TestString":"TestStringValue"}

问题是,当我尝试将JSON字符串反序列化到ToSerializeClass类的实例时:

Gson serializer = new Gson();
ToSerializeClass deserialized = serializer.fromJson(jsonString, ToSerializeClass.class);

我有反序列化的类,它是一个ToSerializeClass实例,但是DerivedClass列表是基类的集合,而不是派生类,所有派生信息都会丢失

如何将字符串反序列化为ToSerializeClass实例,以获得派生类列表

我对源代码有完全的控制权,所以我可以修改我的数据类,在必要时使用不同的集合,创建一些包装器,修改JSON字符串,但如果可能的话,我想使用Gson解决它,并且可以在没有太多开销的情况下完成

谢谢

编辑:例如DerivedClassADerivedClassB

public class DerivedClassA extends BaseClass{
    @SerializedName("FieldA")
    private String fieldA = "This is a derived class.";

    ...

    public DerivedClassA(){
        super();
    }
}

public class DerivedClassB extends BaseClass{
    @SerializedName("FieldB")
    private String fieldB = "This is ANOTHER derived class.";

    @SerializedName("IntValue")
    private int intValue = 10;
    ...

    public DerivedClassB(){
        super();
    }
}

共 (0) 个答案