【问题标题】:Java GSON - Serialize & Deserialize Class with generics type ListJava GSON - 具有泛型类型列表的序列化和反序列化类
【发布时间】:2015-05-03 02:05:30
【问题描述】:

示例类:

public class A
{
    String Name;
    List<B> GenericsList;

    //Getters & Setters & Constructors
}

public class B
{
   String Title;
   //Getters & Setters & Constructors
}

public class C extends B
{
    String Something;
    //Getters & Setters & Constructors
}

如果我像这样序列化 A 类的一个实例:

List<B> bList = new ArrayList<>();
C bObj = new C("name", "something text");
bList.add(bObj);

A aObj = new A("name", bList);

String serialized = new Gson.toJson(aObj);

A deserializedA = new Gson.fromJson(serialized);

我失去了列表中的 C 子类型。 如果它只是一个像这样序列化的列表,我知道如何解决这个问题:

Gson gson = new Gson();
List<B> bList = new ArrayList<>();

Type bType = new TypeToken<List<B>>() {}.getType();
gson.toJson(bList, bType);

gson.fromJson(json, bType);

问题是我的泛型列表位于具有其他参数的对象内。我该怎么做?

编辑 1: 可能我并不清楚具体的问题。

当我序列化和反序列化上面创建的 A 对象时,没有错误,但没有得到这个: 对象 A: 名称=“名称” 泛型列表 = {对象 C}

我得到: 对象 A: 名称=“名称” 泛型列表 = {对象 B}

我失去了亚型 C 的细节。

【问题讨论】:

  • 您能否发布一个具有预期输出的完整示例?请详细说明您看到的行为以及您要询问的内容。
  • 你应该阅读Polymorphism with Gson
  • 没有帮助。问题是我在要反序列化的对象中有一个泛型类型列表。找不到任何具体的答案......

标签: java list generics gson deserialization


【解决方案1】:

知道了!感谢 Sotirios Delimolis 的提示!

必须为 B 类创建自定义实现:

class BGsonAdapter implements JsonSerializer<B>, JsonDeserializer<B>
{
    public JsonElement serialize(B bObj, Type typeOfSrc, JsonSerializationContext context)
    {
        JsonObject result = new JsonObject();
        result.add("Title", context.serialize(B.getTitle(), String.class));

        if (bObj instanceof C)
        {
            result.add("Something", context.serialize(((C)bObj).getSomething(), String.class));
        }

        return result;
    }

    public B deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
    {
        JsonObject object = json.getAsJsonObject();
        B result = null;

        if (object.has("Something"))
        {
            result = new C();
            ((C) result).setSomething((String)context.deserialize(object.get("Something"), String.class));

        if (result == null)
        {
            result = new B();
        }
        result.setTitle(((String)context.deserialize(object.get("Title"), String.class)));

        return result;
    }
}

并像这样使用它:

Gson gson = new GsonBuilder()
            .registerTypeHierarchyAdapter(B.class, new BGsonAdapter())
            .setPrettyPrinting()
            .create();

String serialized = gson.toJson(A);

A deserialized = (A)gson.fromJson(A);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多