【问题标题】:Completing object construction after GSON deserializationGSON反序列化后完成对象构建
【发布时间】:2013-03-07 07:11:30
【问题描述】:

我已成功开始使用 GSON 对我的 Android 应用程序中的对象层次结构进行序列化和反序列化。

一些被序列化的对象具有我必须标记为transient 的成员(或者使用替代的 GSON 注释来防止它们被序列化),因为它们是对我不想作为输出的一部分进行序列化的对象的引用JSON 字符串。这些引用指向必须通过其他方式单独构造的对象。

一旦结构被反序列化回 Java 对象,在某些时候我需要填写这些引用。我可以通过使用一系列setXXX() 类型的方法轻松地做到这一点,但在完成之前,这些对象处于不完整状态。因此,我想知道是否有更强大的方法来解决这个问题。

到目前为止我想到的方法:

  1. 如果对象处于不完整状态,则让它们抛出RuntimeException(或更合适的东西);也就是说,如果在未调用某些初始化方法时要求他们做一些工作。

  2. 将可序列化位分离到单独的数据模型对象中。也就是说,把不能序列化的东西拿出来。在 GSON 反序列化之后,使用组合中的这些数据对象构建我的“真实”对象。这似乎在某种程度上破坏了使用 GSON 的便利性。

  3. 为 GSON 编写一个自定义反序列化程序来处理这些对象的特殊创建。

【问题讨论】:

    标签: java android json gson


    【解决方案1】:

    我可能会采用第二种方法,因为我通常设计我的应用程序,任何需要序列化/反序列化的东西实际上只是普通的旧数据,或者如果您愿意,也可以是 POJO。如果我发现自己需要自定义/配置序列化 API 来做我想做的事,我倾向于简化正在序列化的内容,因此序列化 API 不需要额外的配置。

    所以,如果我有一个更复杂的数据模型,其中一部分不需要序列化/反序列化,那么我会从中提取一组更简单的 POJO,作为一个概念上独立的数据模型来参与序列化/反序列化.这确实需要一个额外的步骤来在两个数据模型之间进行映射,但这通常也很简单。

    如果首选第三种方法,请注意the Instance Creator feature,因为它可以提供另一个有用的挂钩来自定义反序列化过程。

    【讨论】:

    • 非常感谢。我认为我应该采用第二种方法,因为另一个问题是我目前的 JSON 输出与实际的类实现非常紧密地耦合,而且我还担心版本控制(如果将 JSON 文件加载到较新的应用程序中,它可能会变得混乱类结构发生变化的版本)。将应用程序类映射到“模型”类树以实现持久性似乎是解决所有这些问题的好方法。愚蠢的问题,但你会用什么术语来区分真正的工人阶级和数据模型阶级?
    • 可能是 ViewModel,或者 PersistenceModel,或者 SerializedModel,或者 JsonModel,或者 IntegrationModel,或者 ServiceModel,或者别的什么。
    【解决方案2】:

    查看https://github.com/julman99/gson-fire

    这是我创建的一个库,它扩展了 Gson 以处理后序列化和后反序列化等情况

    此外,它还有许多其他很酷的功能,随着时间的推移我需要 Gson。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多