flexjson和版本控制:flexjson如何适应变化?

时间:2013-04-29 10:23:57

标签: serialization deserialization flexjson

我正在考虑使用flexjson将我的业务对象序列化为Android应用程序中的文件,只需使用JSONSerializer()。deepSerialise(myObject)和JSONDeserializer()。deserialise(jsonString)和所有默认变换器和对象工厂。

我希望一旦发布应用程序,就应该通过在新版本中编写flexjsons转换器和对象工厂来保持对业务模型的任何更改,以保持与先前版本的兼容性。

我不确定的是默认变换器和对象工厂可以应对的变化。 即如果我向一个类添加一个字段并从旧版本反序列化而没有该字段进入新类,它将失败或者新字段是null还是0(如果是数字)。同样的问题,如果我删除一个字段,会发生什么。

在标准的java序列化中,这里都记录了这一点。 http://docs.oracle.com/javase/7/docs/platform/serialization/spec/version.html

但我找不到flexjson的等效信息,它明确地处理了与对象版本控制有关的问题,有没有?

干杯, 菲尔。

1 个答案:

答案 0 :(得分:0)

Flexjson将首先查看JSON以查找它包含的任何字段,然后在要反序列化的Object上查找这些字段。因此,向对象添加新字段不会导致反序列化过程失败。新字段将不会从JSON对象填充(即它将保留在构造函数中设置的值或初始化值)。

如果你将来从一个对象中删除一个字段,Flexjson就不会将该值反序列化为该对象,因为它找不到它的setter。

因此,您可以将getter / setter函数视为JSON上关于您想要的内容的声明。您不需要序列化/反序列化JSON对象中的所有值。

唯一真正棘手的部分是重命名字段或更改字段上的类型。重命名字段可以通过保留旧的setter并在旧的setter内部设置新字段来处理。您可以将其标记为私有或受保护以将其隐藏在外部,Flexjson仍将使用它。如果你改变类型它会更棘手。一种选择是保持旧的setter与先前的类型(如setFoo(String)和setFoo(List))并适应新类型。另一种选择是编写ObjectFactory以在两种可能的类型之间进行转换。这当然是最难做到的。最后一个选项是在不更改字段名称的情况下不执行此操作,并使用其他方法之一进行翻译。