像这样的非静态内部类只能使用默认的实例化,反序列化时无参构造函数错误

Sil*_*oJa 8 java deserialization

我正在尝试序列化和反序列化我的对象,但在反序列化期间出现错误:

Cannot construct an instance of 'MyObject' (although at least one Creator exists): 
non-static inner classes like this can only be instantiated using a default, no-argument constructor.
Run Code Online (Sandbox Code Playgroud)

我有带有 2 个参数的类 MyObject 的构造函数,但我将其更改为默认构造函数,但它仍然抛出相同的错误。

这是我的代码:

@Test
public void serializeAndDeserializeTest() throws JsonProcessingException {
    var list = new MyObject[2];
    var t1 = new MyObject();
    t1.value1 = TestEnum.VALUE5.numVal;
    t1.value2 = "A";
    var t2 = new MyObject();
    t2.value1 = TestEnum.VALUE1.numVal;
    t2.value2 = "B";
    list[0] = t1;
    list[1] = t2;
    var mapper = new ObjectMapper();
    var json = mapper.writeValueAsString(list);
    MyObject[] output = mapper.readValue(json, MyObject[].class);
}

public class MyObject
{
    public int value1;
    public String value2;
}

public enum TestEnum
{
    VALUE1(1),
    VALUE3(3),
    VALUE5(5);

    public int numVal;

    TestEnum(int numVal) {
        this.numVal = numVal;
    }
}
Run Code Online (Sandbox Code Playgroud)

我还尝试创建一个私有默认构造函数,但它不起作用。

Ric*_*ick 10

为了解决这个问题,请将MyObject内部类设为静态:

public static class MyObject {
    public int value1;
    public String value2;
}
Run Code Online (Sandbox Code Playgroud)

如果没有 static 关键字,内部类需要包含外部类的实例才能存在。这就是导致异常的原因。

对于情况enum并非如此,因为内部枚举是隐式静态的,请参阅Java 语言规范,第 8.9 章