为什么GSON使用字段而不使用getter / setter?


79

为什么GSON使用字段(私有,公共,受保护)?有没有办法告诉GSON仅使用getter和setter?

Answers:


96

一般来说,当您对对象进行序列化/反序列化时,这样做的目的是得到对象状态的精确副本。因此,您通常希望避开OO设计中通常需要的封装。如果您没有规避封装,则可能无法得到反序列化后与序列化之前状态完全相同的对象。此外,考虑不希望为特定属性提供设置器的情况。如果您正在使用getter和setter,应该如何进行序列化/反序列化?


28
我们想提供给外部世界的“计算域”如何?用您的思维方式,我应该创建一个字段并在每次更新POJO字段之一时更新此字段?Urgh ...
弗雷德里克

2
@Frédéric-我实际上只是指出了使用属性获取器和设置器进行序列化带来的困难;计算出的特性也会带来它们自己的问题。例如,如果您给某人一个序列化的对象,那么他们将更新计算出的属性的值并将其传递回给您,应用程序应如何处理反序列化?假装该属性未更新或引发异常?同样,如果他们更新计算所得属性所基于的属性,则对象状态实际上是无效的,并且读取该属性的值肯定是错误的。
克里斯·谢弗

1
我同意@Frédéric;有一些边缘情况值得使用属性副字段。我只是遇到一个我想排除的对象上有一个字节数组,而是返回一个String的例子。现在,我要通过DTO调整对象。
理查德·克莱顿

计算/派生的字段应加标签,transient以便不进行序列化,并应要求重新计算。
BoffinBrain

14
如果用例是Java到Java的序列化,那很好,但是一个相当普遍的用例是通过REST api调用公开Java对象,在这种情况下,在Java方面,我们不需要双向完美的序列化,我们经常想隐藏字段并序列化(如果需要,可以在需要时反序列化),通常是运行时计算出的属性。
Simone Gianni 2013年

26

有没有办法告诉GSON仅使用getter和setter?

还没。

设计文档

[T]这里也有很好的论据来支持属性。我们打算在以后的版本中增强Gson以支持属性,作为表示Json字段的备用映射。目前,Gson是基于字段的。


关于Gson对getter和setter的支持,邮件列表中的最新更新是“将Gson用作这种功能的可能性很低...” groups.google.com/forum/#!topic / google-gson / 4G6Lv9PghUY
程序员布鲁斯

我认为不应使用getter和setter,Chris Shaffer在此答案中解释了这一点。
哨兵2012年

4
编写一个自定义的序列化器/反序列化器,这样您就可以使用想要将值写回到类中的任何方法。
戴夫·伯奇

2
这个答案很老,stackoverflow的确需要一些“垃圾收集器”。
Azim

@jb不。答案仍然有效。
9ilsdx 9rvj 0lo


0

关于它如何在我们的应用程序中起作用的模糊概述是,我们有很多TypeAdapter实现-一些实现特定的类似于值的对象,还有一些实现了JavaBeans逻辑将起作用的bean样式的对象。然后,我们将所有这些卡GsonBuilder在创建Gson对象之前。

不幸的是,GSON确实不喜欢处理类似的类型Object[]。当我们尝试制作一个JSON对象来表示方法参数时,我们通常会看到这一点。解决方法是制作TypeAdapter反映方法的自定义实例。(这确实意味着您最终要对Gson每个要调用的方法使用一个实例...)


您将如何明智地处理反序列化对象的任何内容?您想如何猜测反序列化的内容?
9ilsdx 9rvj 0lo

对于Object或一般来说对于多态的东西,它们可能具有一个属性记录,该适配器最初将其序列化。但是从内存来看,我认为即使像{“ a”,2,“ b”}这样的显而易见的东西也不会反序列化为Object []。
Trejkaz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.