如何配置XStream使用注解将空的隐式集合反序列化为空列表?当前,我得到一个null
列表,并且XStream正在使我用来对该字段进行预初始化的空列表无效。
背景:
我正在使用XStream从包含隐式元素列表的另一个应用程序反序列化一些XML。例如:
<implicitCollectionContainer>
<implicitCollectionElement field="sdf"/>
<implicitCollectionElement field="ioj"/>
</implicitCollectionContainer>
XStream正确地将上述XML解析为具有两个元素的集合。
当该系统没有结果时,它将返回一个空标签:
<implicitCollectionContainer/>
XStream解析上述XML,但是它给了我null
集合。我希望有一个大小为0的空集合,该集合更易于处理。
XStream实际上正在与我作战,因为我用一个空集合预先初始化了POJO上的字段,然后XStream清除了该空集合。
示例代码:
public static void main(String[] args) {
XStream xstream = new XStream();
xstream.setMode(XStream.NO_REFERENCES);
xstream.ignoreUnknownElements();
Class[] xStreamClasses = {ImplicitCollectionContainer.class, ImplicitCollectionElement.class};
xstream.processAnnotations(xStreamClasses);
// setup security for xstream
// see: http://x-stream.github.io/security.html
xstream.addPermission(NoTypePermission.NONE);
xstream.addPermission(NullPermission.NULL);
xstream.addPermission(PrimitiveTypePermission.PRIMITIVES);
xstream.allowTypeHierarchy(Collection.class);
xstream.allowTypes(xStreamClasses);
String xml1 = "<implicitCollectionContainer/>";
ImplicitCollectionContainer obj1 = (ImplicitCollectionContainer) xstream.fromXML(xml1);
System.out.println("obj1 implicit collection: " + obj1.implicitCollection);
String xml2 = "<implicitCollectionContainer><implicitCollectionElement field=\"sdfd\"/><implicitCollectionElement field=\"ioj\"/></implicitCollectionContainer>";
ImplicitCollectionContainer obj2 = (ImplicitCollectionContainer) xstream.fromXML(xml2);
System.out.println("obj2 implicit collection: " + obj2.implicitCollection + " size=" + obj2.implicitCollection.size());
}
@XStreamAlias("implicitCollectionContainer")
public static class ImplicitCollectionContainer {
@XStreamImplicit
ArrayList<ImplicitCollectionElement> implicitCollection = new ArrayList<>(0);
}
@XStreamAlias("implicitCollectionElement")
public static class ImplicitCollectionElement {
@XStreamAsAttribute
String field = "x";
@Override
public String toString() {
return "ImplicitCollectionElement[field=" + field + "]";
}
}
示例代码输出:
obj1 implicit collection: null
obj2 implicit collection: [ImplicitCollectionElement[field=sdfd], ImplicitCollectionElement[field=ioj]] size=2
版本:
我正在Java 8上使用XStream 1.4.11.1。
律师:
这不是this question的重复,因为我要的是基于注释的配置解决方案,而我明确要求的是避免注释的解决方案。我知道我可以使用注释配置转换器,但我希望有一个更优雅的解决方案。