Gson序列化:如何在其中转换泛型类和泛型数据?

时间:2016-05-02 22:57:46

标签: java generics gson

一个让它更清晰的例子:

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<ExtendedData>投射到DataContainer<Data>并在没有extraData的情况下对其进行序列化。我实际上无法投射DataContainer<ExtendedData>

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

结果,我希望在说明TypeToken之后:{"data":{"baseData":"base_data"}}

extraData是钢铁序列化。我错了什么?

1 个答案:

答案 0 :(得分:1)

Gson在序列化数据时使用反射,因此演员不会改变任何东西。

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

最后一个允许你采取动态行动,因此它是最灵活的。