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

Zem*_*ela 73 java gson

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

Chr*_*fer 91

一般来说,当你序列化/反序列化一个对象时,你这样做是为了得到一个对象状态的精确副本; 因此,您通常希望避免在OO设计中通常所需的封装.如果不绕过封装,则可能无法在反序列化之后使用与序列化之前具有完全相同状态的对象.此外,请考虑您不希望为特定属性提供setter的情况.如果你正在通过getter和setter工作,序列化/反序列化应该怎么做?

  • 我们想为外部世界提供"计算字段"怎么样?在你的思维方式中,我应该创建一个字段并在每次更新我的POJO字段时更新这个字段?Urgh ... (26认同)
  • 如果用例是Java到Java序列化,这很好,但是一个很常见的用例是由于REST api调用而暴露Java对象,在这种情况下,在Java端我们不需要两种方式完美的序列化,更常见的是,我们希望隐藏字段并序列化(并在需要时反序列化)特定的,通常是运行时计算的属性. (14认同)
  • @Frédéric - 我真的只是指出使用属性 getter 和 setter 进行序列化带来的困难;计算属性也会引入它们自己的问题。例如,如果你给某人一个序列化的对象,然后他们更新计算属性的值并将其传回给你,应用程序应该如何处理反序列化?假装属性没有更新或抛出异常?此外,如果他们更新计算属性所基于的属性,则对象状态实际上是无效的,并且读取该属性的值是完全错误的。 (2认同)

Pro*_*uce 25

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

还没.

设计文档:

[T]这里也是支持属性的好参数.我们打算在后一版本中增强Gson以支持属性作为指示Json字段的备用映射.目前,Gson是基于领域的.

  • 这是3年后.任何更新? (51认同)
  • 这是6年后的事了.任何更新? (9认同)
  • 编写自定义序列化器/反序列化器,这样您就可以使用任何方法将值写回到类中. (4认同)
  • 这个答案很老,stackoverflow确实需要一些"垃圾收集器"来获得这样的答案. (2认同)

小智 6

可以修补 Gson 以使用 getter