Я использую 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
?