当前位置: 首页 > 面试题库 >

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

严峰
2023-03-14
问题内容

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.
}

和一个测试

@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文档说什么,如果你的类没有no-args构造函数并且你尚未注册任何InstanceCreater对象,那么它将创建一个ObjectConstructor(which constructs your Object),UnsafeAllocator并使用Reflection使用该对象来获取allocateInstance方法。类sun.misc.Unsafe来创建你的类的实例。

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

分配实例,但不运行任何构造函数。初始化该类(如果尚未初始化)。

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

如果你确实有一个无参数的构造函数,那么Gson将使用ObjectConstructorConstructor通过调用以下命令使用该默认值

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

我的2美分:按照Gson的说法,使用无参数构造函数创建类或注册InstanceCreator。使用,你可能会发现自己处于不利位置Unsafe



 类似资料:
  • Gson用户指南指出,我们应该为任何类定义默认的无参数构造函数,以便正确使用Gson。更重要的是,在Gson的类的javadoc中说,如果我们试图反序列化缺少默认构造函数的类的实例,将引发异常,在这种情况下,我们应该使用。然而,我已经尝试在缺少默认构造函数的类中测试使用Gson,并且序列化和反序列化都可以顺利工作。 下面是反序列化的一段代码。没有非参数构造函数的类: 还有一个测试: 这很好用。 所

  • 问题内容: Gson用户指南指出,我们应该为任何可以正常使用Gson的类定义默认的无参数构造函数。甚至,在Gson 类的javadoc中说,如果我们尝试对缺少默认构造函数的类实例进行反序列化,则会抛出异常,在这种情况下 应 使用该异常。但是,我尝试对缺少默认构造函数的类使用Gson进行测试,并且序列化和反序列化工作都没有任何麻烦。 这是反序列化的代码。没有非参数构造函数的类: 和一个测试: 效果很

  • 问题内容: 我的第一个问题是- 构造函数应始终声明为公共吗? 如果我创建一个构造函数该怎么办。 我总是看到构造函数是隐式的。那么为什么构造函数有用呢?还是根本没有用。因为没有人可以调用它,或者永远也不能创建对象(由于构造函数)!这是我的第二个问题。 问题答案: 不, 构造函数 可以是,, 或(根本没有访问修饰符)。 做某事 并不意味着没有人可以访问它。这只是意味着该类之外的任何人都不能访问它。因此

  • 我正在开发一个Spring Boot应用程序(v2.1.5版本),其中h2是内存数据库。我创建了一个简单的项目,主要和只有一个模型人。java只有3个私有字段。我根本没有构造函数,但当我启动应用程序并打开h2控制台时,我仍然能够看到从实体Person创建的表。我从一个SO问题中读到,当我们使用@entity注释时,需要一个无参数构造函数。它是强制性的吗? 人Java语言 主要类别

  • 实际上,我不明白无参数构造函数和默认构造函数的区别是什么。 在创建名为cFrame的Test对象时,是否调用此类的默认构造函数?

  • 图 6.1 time1.cpp 中的构造函数将 hour、minute 和 second 初始化为 0(即军用时间午夜11时)。 构造函数可以包含默认参数。图 6.8 重新定义 Time 的构造函数,该函数中每个变量的默认参数为0。通过提供构造函数默认参数,即使在构造函数调用中不提供数值,对象也能利用默认参数初始化为一致状态。程序员提供所有参数默认值(或显式不要求参数)的构造函数也称为默认构造函数