Gson user guide声明我们应该为任何类定义默认的无参数构造函数以正确使用 Gson。更重要的是,在 javadoc在 Gson 的 InstanceCreator
类上说,如果我们尝试反序列化缺少默认构造函数的类的实例,则会引发异常,我们应该在这种情况下使用 InstanceCreator
.但是,我尝试在缺少默认构造函数的类中使用 Gson 进行测试,并且序列化和反序列化都可以正常工作。
这是反序列化的一段代码。一个没有非参数构造函数的类:
public class Mushroom {
private String name;
private double diameter;
public Mushroom(String name, double diameter) {
this.name = name;
this.diameter = diameter;
}
//equals(), hashCode(), etc.
}
还有一个测试:
@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 开始。
不管 Gson 文档怎么说,如果你的类没有无参数构造函数并且你没有注册任何 InstanceCreater
对象,那么它将创建一个 ObjectConstructor
(构造你的对象)和一个 UnsafeAllocator
使用反射来获取类 sun.misc.Unsafe
的 allocateInstance
方法来创建你类(class)的实例。
这个 Unsafe
class绕过缺少无参数构造函数并具有 many other dangerous uses . allocateInstance
状态
Allocate an instance but do not run any constructor. Initializes the class if it has not yet been.
所以它实际上不需要构造函数,而是会绕过你的两个参数构造函数。查看一些示例 here .
如果你确实有一个无参数构造函数,Gson 将使用一个 ObjectConstructor
,它通过调用使用默认的 Constructor
yourClassType.getDeclaredConstructor(); // ie. empty, no-args
我的 2 美分:按照 Gson 所说的,使用无参数构造函数创建您的类或注册一个 InstanceCreator
。您可能会发现自己使用 Unsafe
处于不利地位。
关于java - Gson 是否必须使用默认的无参数构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18645050/