Java Gson是否必须使用默认的无参数构造函数?
Gson用户指南指出,我们应该为任何可以正常使用Gson的类定义默认的无参数构造函数。更重要的是,在Gson 类的javadoc中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.
}
和一个测试:
@Testpublic 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文档说什么,如果你的类没有no-args构造函数并且你尚未注册任何InstanceCreater
对象,那么它将创建一个ObjectConstructor
(which constructs your Object),UnsafeAllocator
并使用Reflection
使用该对象来获取allocateInstance
方法。类sun.misc.Unsafe
来创建你的类的实例。
这个Unsafe类是绕着缺乏无参数的构造函数,有许多其他用途的危险。allocateInstance
状态
分配实例,但不运行任何构造函数。初始化该类(如果尚未初始化)。
因此,它实际上不需要构造函数,并且会绕过你的两个参数构造函数。在这里看到一些例子。
如果你确实有一个无参数的构造函数,那么Gson将使用ObjectConstructor
,Constructor
通过调用以下命令使用该默认值
yourClassType.getDeclaredConstructor(); // ie. empty, no-args
我的2美分:按照Gson的说法,使用无参数构造函数创建类或注册InstanceCreator
。使用,你可能会发现自己处于不利位置Unsafe
。
以上是 Java Gson是否必须使用默认的无参数构造函数? 的全部内容, 来源链接: utcz.com/qa/424946.html