Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么GSON使用字段而不是getter/setter?_Java_Gson - Fatal编程技术网

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

Java 为什么GSON使用字段而不是getter/setter?,java,gson,Java,Gson,为什么GSON只使用字段(私有、公共、受保护)? 有没有办法告诉GSON只使用getter和setter?一般来说,当你序列化/反序列化一个对象时,你这样做是为了得到一个对象状态的精确副本;因此,您通常希望绕过OO设计中通常需要的封装。如果不绕过封装,则可能无法得到反序列化后状态与序列化前状态完全相同的对象。另外,考虑不希望为特定属性提供设置程序的情况。如果使用getter和setter,序列化/反序列化应该如何操作 有没有办法告诉GSON只使用getter和setter 还没有 发件人: [T

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

一般来说,当你序列化/反序列化一个对象时,你这样做是为了得到一个对象状态的精确副本;因此,您通常希望绕过OO设计中通常需要的封装。如果不绕过封装,则可能无法得到反序列化后状态与序列化前状态完全相同的对象。另外,考虑不希望为特定属性提供设置程序的情况。如果使用getter和setter,序列化/反序列化应该如何操作

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

还没有

发件人:

[T] 以下是支持属性的好参数。我们打算在后一个版本中增强Gson,以支持属性作为指示Json字段的替代映射。目前,Gson是基于字段的


有可能将Gson修补到。

关于这在我们的应用程序中如何工作的模糊轮廓是,我们有很多
TypeAdapter
实现-一些用于特定的值类对象,一些用于bean样式的对象,我们知道JavaBeans逻辑可以工作。然后,在创建
Gson
对象之前,我们将所有这些内容阻塞到
GsonBuilder


不幸的是,GSON在处理诸如
Object[]
之类的类型方面真的很差劲。当我们试图创建一个JSON对象来表示方法参数时,我们主要看到了这一点。解决方法是定制反映方法的
TypeAdapter
实例。(这确实意味着,对于您打算调用的每个方法,您最终会使用一个
Gson
实例…

关于Gson对getter和setter的支持,邮件列表中对此的最新更新是“[t]这种特性进入Gson的可能性相当低…”我认为不应该使用getter和setter,Chris Shaffer在这个答案中很好地解释了这一点。编写一个自定义序列化器/反序列化器,这样你就可以使用任何方法将值写回到类中。这个答案非常古老,stackoverflow确实需要一些“垃圾收集器”来获得这样的答案。@jb不需要。答案仍然有效。我们想提供给外部世界的“计算字段”如何?按照您的想法,我应该创建一个字段,并在每次更新POJO字段时更新此字段?呃…@Frédéric——我只是想指出使用属性getter和setter进行序列化所带来的困难;计算属性也会带来它们自己的问题。例如,如果您给某人一个序列化对象,那么他们会更新计算属性的值并将其传递给您,那么应用程序应该如何处理反序列化?假装属性未更新或引发异常?此外,如果他们更新了计算属性所基于的属性,那么对象状态实际上是无效的,读取该属性的值是完全错误的;有些边缘情况值得使用属性字段。我刚刚遇到了一个例子,在这个例子中,我在一个对象上有一个字节数组,我想排除它,并返回一个字符串。现在我只剩下通过DTO调整对象了。计算/派生字段应该标记为
transient
,这样它们就不会被序列化,并在请求时重新计算。如果用例是Java到Java序列化,这很好,但一个非常常见的用例是通过REST api调用公开Java对象,在这种情况下,在Java端,我们不需要双向完美序列化,我们更希望隐藏字段并序列化(以及在需要时反序列化)特定的,通常是运行时计算的,我希望能够指定哪些变量应该使用getter和setterHow来处理对象的反序列化?为了反序列化它,您想如何猜测它是什么?对于对象,或者对于一般的多态性内容,它们可能有一个属性记录,适配器最初将其序列化。但从内存来看,我认为即使是像{“a”,2,“b”}这样明显的东西也没有反序列化到对象[]。