Очень часто при работе над каким-либо проектом (как учебным, так и коммерческим) я сталкиваюсь с ...
Очень часто при работе над каким-либо проектом (как учебным, так и коммерческим) я сталкиваюсь с необходимостью сохранения каких-либо сложных данных на диск и чтения их оттуда. Казалось бы — сделай свой формат, хоть текстовый, хоть бинарный, опиши методы чтения/записи и пользуйся, ни о чем не думая.
Однако со временем возникают две проблемы. Первая связана с увеличением количества данных: если файл хранит в себе несколько десятков, а то и сотен совершенно различных значений, то поддерживать методы для сохранения и загрузки становится тяжеловато и хочется некой автоматизации. Вторая проблема несколько сложнее. Представим себе, что со временем нам начинает требоваться запихивать в наш файл все больше и больше данных (конечно, при хорошем проектировании подобные вещи не должны возникать, но где вы видели хорошее проектирование в учебных проектах? да и в коммерческих такое сплошь и рядом). При этом продукт уже используется и уже сохранено достаточное количество файлов, не содержащих эти данные, но которые надо уметь загружать и использовать. Понятно, что описывать каждый формат вручную и пытаться распознать, какую же версию файла нам подсовывают — не выход.
В этой статье я хочу рассказать о том, как сделать свой формат данных, нечувствительный к изменению и работающий с любой из своих предыдущих версий.
Сразу хочу предупредить, что для самой процедуры чтения/записи файла я буду использовать бинарную сериализацию. Кое-что из того, что будет сказано в дальнейшем, применимо и к XML-сериализации, но в своей текущей работе мы с коллегами используем именно бинарную (из-за меньшего объема получающихся файлов и большей скорости работы системы в целом).
Неудивительно, что вышеописанная проблема имеет не одно решение. Я расскажу о двух вариантах, каждый из которых имеет свои особенности.
Читать дальше →