如何配置XStream以使用注释将一个空的隐式集合反序列化为一个空列表?

时间:2019-02-25 22:32:05

标签: java xml xstream

如何配置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的重复,因为我要的是基于注释的配置解决方案,而我明确要求的是避免注释的解决方案。我知道我可以使用注释配置转换器,但我希望有一个更优雅的解决方案。

0 个答案:

没有答案