Прочитав Data Contract Versioning, мы пришли к выводу, что это не совсем целая история. Например, что произойдет, если вы использовали ValueA, а в новой версии теперь называется ValueB и имеет другой тип, и вам нужно преобразовать ValueA в ValueB?Простой контроль версий файлов данных с DataContractSerializer
Есть некоторые callbacks, которые я мог бы использовать, чтобы помочь с этим, но это не похоже на очень удобное решение, если мы ожидаем, что формат будет часто меняться в течение длительного периода времени.
Решение, по которому мы остановились, заключается в том, чтобы сохранить поле «сохранено по версии» и после загрузки файлов вызывать программы конверсии, относящиеся к более старым версиям, по мере необходимости. Эти процедуры преобразования знают, как преобразовать XML для более старых данных в XML для новых данных.
Однако, как выясняется, DataContractSerializes requires the order of the elements to be exactly what it expects. Это означает, что наш процесс преобразования должен знать, чтобы вставить элементы в точно в нужное место. Это намного сложнее, чем просто добавление элемента с известным именем, если вы учитываете наследование. С наследованием вы не можете надежно или AddAfterSelf
любое поле, просто потому, что рядом с этим новым полем нет ни одного поля.
Оставляя в стороне причины, почему DataContractSerializer был сделан настолько строгим, можете ли вы предложить варианты вокруг этого? Возможно, замечательная статья о том, как оставаться обратно совместимой с очень старыми контрактами данных, которая не становится громоздкой в тот момент, когда вы сделали 100-е изменение в формате.
Есть несколько дополнительных рекомендаций в this article, но это, должно быть, было написано для другой цели. Например, мы не можем оставлять старые элементы данных навечно навечно (пункт 9). Похоже, что большинство таких статей написаны с точки зрения протокола связи, а не для хранения данных в файле.
Это довольно крупный контракт; Я действительно ненавидел бы копировать и вставлять большую часть его только для того, чтобы изменить bool «Enabled» на enum «State», например. Я собираюсь придерживаться предварительной обработки XML, которая, несмотря на проблемы, описанные в вопросе, довольно просто реализуется. –