【发布时间】:2011-12-02 14:02:58
【问题描述】:
我使用 gson 反序列化小部件层次结构,但在反序列化最终字段时遇到问题。
例子:
public final class Screen{
@Expose
private final List<WidgetDefinition> children = null;
@Expose
private final String name = null;
}
public final class AWidget implements WidgetDefinition {
@Expose
private final String name = null;
}
我正在使用 WidgetDefinition 的自定义反序列化器反序列化屏幕,如下所示。 Screen 中的 'name' 设置正确,AWidget 中的 'name' 保持为空。
final class Deserializer implements JsonDeserializer<WidgetDefinition> {
public WidgetDefinition deserialize(final JsonElement json, final Type type,
final JsonDeserializationContext context) {
JsonObject jsonObject = json.getAsJsonObject();
String typeName = jsonObject.get("type").getAsString();
if (typeName.equals("awidget")) {
return context.deserialize(json, AWidget.class);
} else {
return null;
}
}
}
编辑:我想知道它是否与此有关:
Gson 1.7 不会序列化集合元素中的子类字段。 2.0 添加了这个额外的信息。
(https://sites.google.com/site/gson/gson-roadmap)
【问题讨论】:
-
为什么要反序列化为最终字段? final 的意思是声明这不会改变,所以你似乎真的在破解你自己的模型。
-
我想要不可变的对象。除了从 gson 解析它们之外,我不会在任何地方创建这些对象,之后也无需更改它们。在我看来,不变性总是更好。
-
是的,但是您可以将它们设为私有并且不提供设置器 - 这可以达到相同的目的吗?
-
差不多。我在内部设置了一些成员,我喜欢通过在我的成员中设置最终部分和非最终部分来区分它们。我只是想知道为什么 gson 会这样。
-
@FabianZeindl 派对有点晚了,但我同意你的观点。当不可变对象对简化多线程模型至关重要时,Java 没有提供处理不可变对象的内部序列化能力,这对我来说是永无止境的恶化。
标签: java json deserialization gson final