Должен ли я использовать пространство имен файла XML, чтобы определить его версию - PullRequest
2 голосов
/ 30 июня 2010

Я использую DataContractSerializer для сериализации класса с атрибутами DataContract и DataMember в файл XML.Мой класс потенциально может измениться позже, и, следовательно, формат сериализованных файлов также может измениться.Я хочу пометить файлы, которые я сохраняю, номером версии, чтобы я, по крайней мере, знал, с какой версии у каждого файла.Я все еще решаю, как и если я хочу добавить функциональность, которая будет переносить файлы в старых форматах в более поздние форматы.Но сейчас я был бы рад просто определить несоответствие версий.

Является ли пространство имен XML-файла правильным местом для хранения версии файла?Я думал о том, чтобы приписать свой класс атрибутам DataContract следующим образом.

[DataContract(Name="MyClass",Namespace="http://www.mycompany.com/MyProject/1.0
public class MyClass
    ...

Затем, если MyClass изменится, я бы изменил пространство имен ...

[DataContract(Name="MyClass",Namespace="http://www.mycompany.com/MyProject/2.0)]
public class MyClass
    ...

Это правильное использованиепространств имен XML или есть другой более предпочтительный способ сохранить версию файла XML?

1 Ответ

3 голосов
/ 30 июня 2010

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

Теперь одно из преимуществ XML состоит в том, что он может быть легко обработан совместимым способом с такими технологиями, как XPath и XSLT - вы просто выбираете элементы, которые можете интерпретировать, и оставляете то, что вы не распознаете, как есть. Но для этого необходимо, чтобы элементы с одинаковым значением сохраняли одно и то же имя (включая пространство имен) между версиями.

В общем, лучше сделать ваши схемы совместимыми с * forward * . Если вы не можете этого достичь, вам все же может потребоваться обеспечить как можно большую совместимость с существующими инструментами (зачастую легче добиться совместимости с инструментами, которые только читают данные, а не с теми, которые их также пишут). Следовательно, в таких случаях вы избегаете сохранения номера версии и просто пытаетесь разобрать все, что вам дали, сигнализируя об ошибке, если входные данные явно искажены.

Если вы дошли до того, что вам абсолютно необходимо нарушить совместимость в обоих направлениях и начать с чистого листа, предложенный способ обработки этого для контрактов данных WCF действительно заключается в изменении пространства имен, как описано в рекомендациях по версии контракта данных . Там также есть несколько незначительных изменений, таких как использование даты публикации вместо номера версии в URL (W3C очень любит это для своих схем), но они в основном стилистические.

...