Версионность сериализованных данных

Сложность 100-200

Во время изучения событийных систем и CQRS, поднимается вопрос о том, что надо каким-то образом читать и преобразовывать старые данные (как правило сериализованные в xml или json) к текущему состоянию системы, которая скорее всего изменилась со времени запуска. На самом деле проблема восстановления данных, чаще всего каких-либо настроек, весьма остро порой встает перед разработчиками. Т.е. у нас есть некоторое приложение, которое было уже доставлено конечному пользователю, и нам надо изменить формат сохранения настроек, сообщений. Если смотреть на проблему очень поверхностно, то обычно читаются настройки в старом формате, руками преобразуются в новый формат и сохраняются уже в новом виде.

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

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

На примере ниже сохраняются и восстанавливаются настройки расположения клиентских настроек для MDI приложения. Именно от того, что надо работать с любой версией настроек и было применено ручное составление и разбор XML файла. В доказательство можно привести проверку на внутреннюю версию файла. Хотя… что-то я смотрю и вижу, что старые версии не восстанавливаются, йехъ.

01

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

Подробнее