Объект для XML, обратной и прямой совместимости

Я работаю в приложении, где нужно сохранить объекты в формате XML и загрузить их позже, как только требуется. Для этого я использовал JAXB для Маршалла и unmarshall XMLs обратно в классы Java.

моя проблема в том, что я должен когда-нибудь изменить модели Java (добавив, переименовав или удалив атрибуты), в результате у меня будут несовместимые сохраненные XMLs, которые не могут быть привязаны к новой форме класса.

чтобы решить эту проблему, каждый раз, когда я должен сделать изменения я скопируйте все классы в новый пакет (названный в честь его версии) и примените запрошенные изменения. И при сохранении XML я сохраняю его версию, чтобы я мог решить, какой пакет должен быть отсканирован JAXB, чтобы разобрать этот XML.

мой вопрос в том, есть ли другой способ реализовать обратную и прямую совместимость с помощью JAXB? Если нет, есть ли какие-либо другие технологии, которые могут это поддержать?

2 ответов


Примечание: Я являюсь членом JAXB 2 (JSR-222) группа экспертов и ведущий EclipseLink JAXB (MOXy).

для этого примера я предпочитаю использовать одну модель, когда это возможно. Это потребует наличия нескольких сопоставлений для объектной модели. Спецификация JAXB не предоставляет средства для этого, но это можно сделать с помощью внешних метаданных MOXy расширение:

метаданные могут использоваться для дополнения аннотаций или для их замены. Поэтому я бы рекомендовал сопоставить базовую схему с аннотациями и использовать формат XML для изменения метаданных для каждой версии схемы.

моя проблема в том, что я должен измените модели Java когда-нибудь (by добавление, переименование или удаление атрибуты), в результате у меня будет несовместимые сохраненные XMLs, которые не могут быть привязка к новой форме класса.

удаление атрибута Java (поле / свойство) затрудняет работу, так как для старого XML не будет ничего сопоставлять. Вместо этого вы можете оставить их в своей модели и пометить их "@XmlTransient" в файлах метаданных XML.


Если вы добавляете только новые атрибуты, он все еще может работать: он называется "утиный ввод". Ваш объект свободен, он игнорирует дополнительные вещи, которые он не делает.

вам нужно беспокоиться только о управлении версиями, если вы изменяете или удаляете необходимые атрибуты. К сожалению, это относится к схемам баз данных, сериализации Java и любой другой технологии сохранения. XML-это не магия, это не иммунитет.