Объект в XML, обратная и прямая совместимость - PullRequest
8 голосов
/ 04 марта 2011

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 04 марта 2011

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

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

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

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

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

1 голос
/ 04 марта 2011

Если вы добавляете только новые атрибуты, они все равно могут работать: это называется «утка». Ваш объект свободен, он игнорирует лишние вещи, которых нет.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...