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

标签 java json gson default-constructor

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.UnsafeallocateInstance 方法来创建你类(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/

相关文章:

java - 项目 Euler #3 超出整数范围 java

python - 在 Python 中访问嵌套的 JSON 元素

android - Retrofit - 解析没有 SerializedName 的 json

java - XMLStreamException : XML version "1.1" is not supported, 仅支持 XML 1.0

java - JavaMail 线程安全中的 IMAPStore 和 IMAPFolder 吗?

java - 如何纠正无语法约束错误

javascript - 第二次单击时反向排序 - Javascript

java - 我可以让 Gson.fromJson() 使用 String.intern 或对频繁使用的字符串使用 StringPool

java builder模式对象的spring bean创建

java - 保留属性的原始 JSON 字符串