Gson是默认的无参数构造函数吗?

Gson用户指南指出,我们应该定义任何类的默认无参数构造函数来正确使用Gson。 更甚者,在Gson的InstanceCreator类的javadoc上说,如果我们尝试反序列化类的实例,缺less默认的构造函数,我们应该在这种情况下使用InstanceCreator 。 不过,我试着用缺乏默认构造函数的类来testingGson,而序列化和反序列化都没有任何问题。

这是deserializaiton的一段代码。 没有非参数构造函数的类:

 public class Mushroom { private String name; private double diameter; public Mushroom(String name, double diameter) { this.name = name; this.diameter = diameter; } //equals(), hashCode(), etc. } 

和一个testing:

 @Test public void deserializeMushroom() { assertEquals( new Mushroom("Fly agaric", 4.0), new Gson().fromJson( "{name:\"Fly agaric\", diameter:4.0}", Mushroom.class)); } 

这工作正常。

所以我的问题是: 我真的可以使用Gson而不需要有默认的构造函数,或者在任何情况下它不起作用?

从Gson 2.3.1开始。

不pipeGson的文档是什么,如果你的类没有没有参数的构造函数,并且你没有注册任何InstanceCreater对象,那么它将创build一个ObjectConstructor (它构造你的对象)与一个UnsafeAllocator ,它使用reflection来获得类sun.misc.Unsafe allocateInstance方法来创build你的类的实例。

这个Unsafe类绕过缺乏无参数的构造函数,还有许多其他危险的用途 。 allocateInstance状态

分配一个实例,但不运行任何构造函数。 初始化类,如果它还没有。

所以它实际上并不需要一个构造函数,并会绕过你的两个参数构造函数。 看到这里的一些例子。

如果你有一个没有参数的构造函数,Gson将使用一个ObjectConstructor来使用默认的Constructor通过调用

 yourClassType.getDeclaredConstructor(); // ie. empty, no-args 

我的2美分:按照Gson所说的,用无参数构造函数创build类或注册一个InstanceCreator 。 您可能会发现自己处于Unsafe

jackson图书馆有一个很好的解决scheme,如下所述:

https://stackoverflow.com/a/11838468/2854723

重点是通过Mix-Infunction告诉序列化程序在使用带有参数的构造函数时使用哪些JSON字段。

如果该实体是外部库的一部分,则可以使用创build者function “远程注释”。