我正在考虑使用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的等效信息,它明确地处理了围绕对象版本控制的问题,有吗?
干杯,菲尔。
发布于 2013-04-30 04:36:28
Flexjson将首先查看JSON以查找它包含的所有字段,然后在要反序列化的对象上查找这些字段。因此,向对象添加新字段不会导致反序列化过程失败。新字段将不是从JSON对象填充的(即它将保留在构造函数中设置的值或初始化值)。
如果将来从对象中删除一个字段,Flexjson将不会将该值反序列化到对象中,因为它不会为其找到setter。
因此,您可以将getter/setter函数看作是对JSON的声明,您希望从中得到什么。您不需要序列化/反序列化JSON对象中的所有值。
唯一真正棘手的部分是重命名字段,或者更改字段的类型。可以通过保留较旧的setter并在内部设置该较旧的setter中的新字段来处理重命名字段。您可以将其标记为私有或受保护,以向外部隐藏它,Flexjson仍将使用它。如果你改变了类型,那就麻烦多了。一种选择是保留具有先前类型的旧setter (如setFoo(String)和setFoo(List)),并适应新类型。另一种选择是编写ObjectFactory以将其转换为两种可能的类型。这当然是最难做到的。最后一个选项是,在不更改字段名称的情况下不要执行此操作,并使用其他方法之一进行转换。
https://stackoverflow.com/questions/16276296
复制相似问题