【问题标题】:Gson serialization: how to cast generic class and generic data inside it?Gson 序列化:如何在其中转换泛型类和泛型数据?
【发布时间】:2016-05-02 22:57:46
【问题描述】:

一个更清楚的例子:

public class GsonDemo {

    public static void main(String[] args) {
        Gson gson = new Gson();

        DataContainer<ExtendedData> dataContainer = new DataContainer<ExtendedData>();
        dataContainer.data = new ExtendedData();
        dataContainer.data.baseData = "base_data";
        dataContainer.data.extraData = "extra_data";

        String json = gson.toJson(dataContainer); // {"data":{"extraData":"extra_data","baseData":"base_data"}}
        System.out.println(json);

        json = gson.toJson(dataContainer, new TypeToken<DataContainer<Data>>() {}.getType());
        System.out.println(json); // i don't want 'extraData' here. Why it steel serializing?
    }

}

以及我使用的数据类:

class DataContainer<D extends Data> {
    D data;
}

class Data {
    String baseData;
}

class ExtendedData extends Data {
    String extraData;
}

我想将DataContainer&lt;ExtendedData&gt; 转换为DataContainer&lt;Data&gt; 并在没有extraData 的情况下对其进行序列化。我实际上不能投DataContainer&lt;ExtendedData&gt;

DataContainer<Data> castedDataContainer = (DataContainer<Data>) dataContainer; // Inconvertible types; cannot cast 'DataContainer<ExtendedData>' to 'DataContainer<Data>'

结果,我期望在指令 TypeToken:{"data":{"baseData":"base_data"}}

但是extraData是钢铁连载。我做错了什么?

【问题讨论】:

  • 从不期望一个简单的演员阵容在这里有所作为。我希望你需要做一个明确的副本。

标签: java generics gson


【解决方案1】:

Gson 在序列化数据时使用反射,因此强制转换不会改变任何内容。

您想要控制哪些字段被序列化。你有几种选择:

最后一个允许你动态地行动,所以它是最灵活的。

【讨论】:

  • 是的,我也想custom adapter,它看起来是最正确的方式。
猜你喜欢
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
相关资源
最近更新 更多