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 章