gpt4 book ai didi

java - 反序列化最终列表属性

转载 作者:行者123 更新时间:2023-12-02 08:55:15 26 4
gpt4 key购买 nike

假设我们有一个类似 Test 的类:

public class Test {
private final String name;
private final List<String> list = new ArrayList<>();

public Test(String name) {
this.name = name;
}

void add(String s) {
list.add(s);
}

void print() {
System.out.println("name: " + name);
for (String s : list) {
System.out.println(" - " + s);
}
}
}

没有 XSteam 不变式

this.list != null

每次都成立。

但是如果我们看一下第四个测试

public static void main(String[] args) {
final XStream xstream = new XStream();
xstream.alias("test", Test.class);

// Serialize
final Test test1 = new Test("XYZ");
test1.add("One");
test1.add("Two");

//@formatter:off
/* name: XYZ
* - One
* - Two
*/
//@formatter:on
test1.print();

//@formatter:off
/* <test>
* <name>XYZ</name>
* <list>
* <string>One</string>
* <string>Two</string>
* </list>
* </test>
*/
//@formatter:on
System.out.println(xstream.toXML(test1));

// Deserialize with one list entry
final String xmlTest2 = "<test><name>XYZ</name><list><string>One</string></list></test>";
final Test test2 = (Test) xstream.fromXML(xmlTest2);
//@formatter:off
/* <test>
* <name>XYZ</name>
* <list>
* <string>One</string>
* </list>
* </test>
*/
//@formatter:on
test2.print();

// Deserialize with empty list
final String xmlTest3 = "<test><name>XYZ</name><list /></test>";
final Test test3 = (Test) xstream.fromXML(xmlTest3);
//@formatter:off
/* name: XYZ
*/
//@formatter:on
test3.print();

// Deserialize without list-tag
final String xmlTest4 = "<test><name>XYZ</name></test>";
final Test test4 = (Test) xstream.fromXML(xmlTest4);
//@formatter:off
/* name: XYZ
* Exception in thead ... NullPointerException
*/
//@formatter:on
test4.print();
}

我们看到一个 NullPointerException,因为 list 未初始化。

我希望 XML 可选中的 list 元素与 test4 类似。我能做些什么?因为我的数据模型中有许多类似于 Test 的类,所以我不想为每个类编写一个 Converter 。但是假设我要编写一个 Converter,如何设置最终属性 name

最佳答案

XStream 在增强模式(默认)下使用 munged 构造函数 (http://stackoverflow.com/questions/1426106/why-are-constructors-returned-by-reflectionfactor-newconstructorforserialization)。您可以通过在纯模式下初始化 XStream 来更改此行为:

XStream xstream = new XStream(new PureJavaReflectionProvider());

另一种选择是使用 getter 访问变量并实现延迟初始化。

public class Test {
private final String name;
private List<String> list;

public Test(String name) {
this.name = name;
}

void add(String s) {
list.add(s);
}

List<String> getList() {
if (list == null) {
list = new ArrayList<>();
}
return list;
}

void print() {
System.out.println("name: " + name);
for (String s : getList()) {
System.out.println(" - " + s);
}
}
}

关于java - 反序列化最终列表属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13458458/

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