一个让它更清晰的例子:
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
是钢铁序列化。我错了什么?
答案 0 :(得分:1)
Gson在序列化数据时使用反射,因此演员不会改变任何东西。
您想要的是控制哪些字段被序列化。你有几种选择:
transient
。@Expose
annotation and mark only the fields you want to serialize。最后一个允许你采取动态行动,因此它是最灵活的。