17

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

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

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

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

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

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

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

4

2 回答 2

11

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

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

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

于 2014-02-12T18:38:53.010 回答
6

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

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

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

于 2013-04-03T06:02:16.907 回答