gpt4 book ai didi

java - Gson 是否强制使用默认的无参数构造函数?

转载 作者:太空宇宙 更新时间:2023-11-04 11:06:13 25 4
gpt4 key购买 nike

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它使用反射来获取 allocateInstance类的方法sun.misc.Unsafe创建您的类的实例。

这个 Unsafe class解决了缺少无参数构造函数的问题,并具有 many other dangerous usesallocateInstance

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/46459110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com