Хороший способ справиться с изменениями XML - PullRequest
2 голосов
/ 08 февраля 2010

Наша система хранит строки XML в базе данных. Недавно мне пришлось изменить свойства класса, и теперь, когда строка XML десериализуется, она выдаст исключение. Каков наилучший способ справиться с этим изменением? Ищите узел в коде приложения, используя XPATH или LINQ, или измените строку xml в базе данных sql (т.е. выполните массовое обновление)?

Ответы [ 3 ]

1 голос
/ 08 февраля 2010

Возможно, вы захотите написать собственный десериализатор XML (т.е. реализовать IXmlSerializable, см. здесь ) для обработки изменений в вашем XML.Если вы потратили много времени на создание атрибутов сериализации XML, вам может понадобиться другой подход.

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

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

0 голосов
/ 08 февраля 2010

Хорошей практикой является хранение версии в ваших XML-строках. Либо на уровне базы данных, либо на уровне класса, чтобы ваш код знал, какую версию класса он должен десериализовать.

Вы также можете посмотреть на XSLT. Это позволяет вам преобразовывать одну версию XML в другую. В этом случае логика перехода от одной версии к другой обрабатывается не кодом, а XSLT. Вы даже можете сохранить XSLT в базе данных, что позволяет использовать его другими программами.

0 голосов
/ 08 февраля 2010

если вы сериализовали объекты в базу данных, вы можете попробовать подход, который я обрисовал в общих чертах здесь , чтобы загрузить старые версии в новую версию, тогда при сохранении новая версия будет сохранена. Не уверен, что подойдут разные версии вашего класса ...

По сути, вы создаете фабрику для производства ваших объектов из XML. каждый раз, когда вы изменяете свой объект, вы создаете новую фабрику и новый класс объекта, которому дается версия старого класса в его конструкторе, и он создает себя из старого класса. Новая фабрика пытается создать новый объект из xml, если это возможно, счастливые дни, если не может, то создает новый объект и говорит следующей самой старой фабрике создать следующий самый старый объект из xml. Затем эти фабрики можно связать вместе, чтобы вы всегда могли загрузить самую новую версию объектов из любых данных в БД.

Предполагается, что всегда возможно создать действительный объект v2 из объекта v1.

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