Използвам 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
?