Как я могу настроить XStream для десериализации пустой коллекции имплитов в виде пустого списка с использованием аннотаций? - PullRequest
0 голосов
/ 26 февраля 2019

Как я могу настроить 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

Версии:

Я использую XStream 1.4.11.1 на Java 8.


Lawyering:

Это не дублированиеиз этот вопрос , потому что я запрашиваю решение для конфигурации на основе аннотаций, в то время как тот явно запрашивает решение, которое избегает аннотаций.Я знаю, что могу настроить конвертер, используя аннотации, но я надеюсь на более элегантное решение.

...