Лучший / самый портативный способ для версии файла формата - PullRequest
0 голосов
/ 28 августа 2010

Этот вопрос касается XML-схем и файлов.

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

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

Каков наилучший способ реализации такого рода функциональности?Мне кажется, что самый простой способ - использовать разные пространства имен схемы для каждой ревизии и гарантировать, что хотя бы элемент документа файла ссылается на правильное пространство имен.Проблема с этим подходом состоит в том, что, на мой взгляд, он нарушает отношения файловых структур друг к другу, то есть элемент документа файла, сохраненного в ревизии x, имеет тот же тип , что и соответствующий элемент в ревизииy, но, насколько известно приложению, они не связаны, если я не укажу это явно.Однако я осмелюсь сказать, что подобная логика является одной из причин существования пространств имен XML, поэтому я, честно говоря, не уверен.Что вы скажете, ТАК?

edit # 1 :

При дальнейшей проверке выясняется, что XML-схема изначально предоставляет атрибут 'version'.Предположительно, это источник строкового свойства «Версия» для типа XmlSchema в .Net, который является моей предполагаемой платформой.Это все хорошо, но получение i) моих файлов и ii) моего заявления об уважении этой ценности - другое дело.Было бы тривиально, как предлагает kbrimington , назначать атрибут «версия схемы» в файлах приложения.Затем я просто сопоставляю атрибут версии из загруженного xml-файла со схемой, запускаю проверку и заставляю приложение подбрасывать / вежливо упрекать пользователя / отважно бороться в зависимости от ситуации.

edit # 2:

В случае, если кому-то это интересно, я использовал атрибут 'version' на схеме и сопоставил его с пользовательским атрибутом, который применяется к оболочке.Оболочка извлекает строку из файла ресурсов проекта, представляющего схему (будет проверка, чтобы убедиться, что версия схемы и версия, указанная в атрибуте, совпадают).Первое, что делает main (), это создает таблицу поиска схем для индексации по версии, используя Reflection для проверки доступных типов оболочки версии.Это звучит как сверхнормативный способ ведения дел, но я пытаюсь думать заранее и наращивать избыточность и гибкость, используя несколько произвольных шагов, в которые можно вставить новую функциональность.Возможные улучшения включают в себя реализацию пользовательского типа менеджера ресурсов, чтобы обойти некоторые из описанных здесь функций Хита-Робинсона.

1 Ответ

2 голосов
/ 28 августа 2010

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

Я бы рекомендовал определить по крайней мере некоторые инвариантные правила для вашего формата файла.Индикатор версии может быть пространством имен, как вы предложили, расширением файла или даже просто элементом в известной позиции в документе.

Если вы можете сказать: "Всегда будет элемент <version> здесь , независимо от схемы, которую я могу использовать, чтобы определить, какую версию схемы использовать при проверке ... ", тогда проблема решена.Суть в том, чтобы иметь что-то, от чего можно зависеть, чтобы определить версию, независимо от того, что еще может измениться.

...