XStream не игнорира неизвестни елементи, когато използва JavaBeanConverter

Използвам XStream 1.4.7, за да се справя с де/сериализацията на POJO. С развитието на проекта ще трябва да добавя нови функции и следователно нови полета за класове. Бих искал старите версии на приложението да се справят с тези промени елегантно и да игнорират неизвестни тагове.

xs = new XStream();
xs.setMode(XStream.NO_REFERENCES);
xs.ignoreUnknownElements();
xs.registerConverter(new JavaBeanConverter(xs.getMapper(),
    new TransientRespectingBeanProvider()), XStream.PRIORITY_VERY_LOW);

Вчера добавих поле String към един от моите класове и го сериализирах. По-стара версия на приложението не успя да десериализира xml.

com.thoughtworks.xstream.converters.ConversionException: No field 'materialNrVersion' found in class 'com.company.ProjectConfiguration' : No field 'materialNrVersion' found in class 'com.company.ProjectConfiguration'
---- Debugging information ----
message             : No field 'materialNrVersion' found in class 'com.company.ProjectConfiguration'
cause-exception     : com.thoughtworks.xstream.converters.reflection.MissingFieldException
cause-message       : No field 'materialNrVersion' found in class 'com.company.ProjectConfiguration'
class               : com.company.ProjectConfiguration
required-type       : com.company.ProjectConfiguration
converter-type      : com.thoughtworks.xstream.converters.javabean.JavaBeanConverter
line number         : 192
version             : 1.4.7

Трябва ли да правя това по различен начин?

АКТУАЛИЗАЦИЯ Ако коментирам извикването registerConverter, тогава неизвестните полета се игнорират. JavaBeanConverter изглежда влияе върху начина, по който се борави с ignoreUnknownElements. TransientRespectingBeanProvider е предназначен да игнорира свойства, които имат @Transientанотация.

Може ли някой да предложи решение или заобиколно решение? Алтернативен подход към проблема @Transient?


person paul    schedule 17.09.2015    source източник


Отговори (1)


Изходният код на xStream е доста ясен и ясен. Можете да създадете подклас на JavaBeanConverter и да промените неговия метод unmarshal и да регистрирате променения конвертор за някои или всички ваши класове. По-специално, ако погледнете източника на JavaBeanConverter.unmarhal(), има

if (propertyExistsInClass) {
    ...
} else {
    throw new MissingFieldException(resultType.getName(), propertyName);
}

Така че, ако замените класа, копирате оригиналния код на unmarshal метода и коментирате само реда throw ..., той трябва да работи добре за вас. Използвал съм такива хакове за XStream няколко пъти и винаги работеше както бих очаквал, без неприятни изненади.

person Jan X Marek    schedule 19.12.2015