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

2022-09-03 02:11:03

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

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

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

到目前为止,我的想法:

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

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

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


答案 1

退房 https://github.com/julman99/gson-fire

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

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


答案 2

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

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

如果首选第三种方法,则还要注意实例创建器功能,因为它可以为自定义反序列化过程提供另一个有用的挂钩。