【问题标题】:flexjson and versioning : how accommodating change is flexjson?flexjson 和版本控制:flexjson 如何适应变化?
【发布时间】:2013-04-29 10:23:57
【问题描述】:

我正在考虑使用 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 的等效信息,它明确处理围绕对象版本控制的问题,有吗?

干杯, 菲尔。

【问题讨论】:

    标签: serialization deserialization flexjson


    【解决方案1】:

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

    如果您将来从对象中删除一个字段,Flexjson 将根本不会将该值反序列化到对象中,因为它不会找到它的设置器。

    因此,您可以将 getter/setter 函数视为对 JSON 的声明,说明您想要从中得到什么。您不需要序列化/反序列化 JSON 对象中的所有值。

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

    【讨论】:

    • 请问,如果在对象中不存在的json中添加了额外的字段,FlexJSON反序列化会失败吗?
    • 它只是忽略了那个字段。
    • 感谢您告诉我。
    猜你喜欢
    • 2017-01-24
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    相关资源
    最近更新 更多