在GSON反序列化之后完成对象构造

时间:2013-03-18 19:41:35

标签: java android json gson

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

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

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

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

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

  2. 将可序列化的位分离为单独的数据模型对象。换句话说,拿出无法序列化的东西。在GSON反序列化之后,使用组合中的这些数据对象构建我的“真实”对象。这似乎在某种程度上打败了使用GSON的便利性。

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

2 个答案:

答案 0 :(得分:9)

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

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

与Gson一起,它还有许多其他很酷的功能。

答案 1 :(得分:6)

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

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

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