Как я могу настроить 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:
Это не дублированиеиз этот вопрос , потому что я запрашиваю решение для конфигурации на основе аннотаций, в то время как тот явно запрашивает решение, которое избегает аннотаций.Я знаю, что могу настроить конвертер, используя аннотации, но я надеюсь на более элегантное решение.