Простой способ добиться подобия управления версиями состоит в том, чтобы разобраться в элементах объектов, которые вы сериализуете. Если ваш код понимает различные типы данных, которые нужно сериализовать, вы можете получить некоторую надежность, не выполняя слишком много работы.
Скажем, у нас есть сериализованный объект, который выглядит так:
ObjectType
{
m_name = "a string"
m_size = { 1.2, 2.1 }
m_someStruct = {
m_deeperInteger = 5
m_radians = 3.14
}
}
Должно быть легко увидеть, что у типа ObjectType
есть члены с данными m_name
, m_size
и m_someStruct
. Если вы можете циклически перебирать или перечислять элементы данных во время выполнения (каким-либо образом), то при чтении этого файла вы можете прочитать имя члена и сопоставить его с фактическим членом в вашем экземпляре объекта.
На этом этапе поиска, если вы не нашли подходящий элемент данных, вы можете спокойно проигнорировать эту часть файла сохранения. Например, скажите, что у версии 1.0 SomeStruct
был m_name
член данных. Затем вы исправляете, и этот элемент данных был полностью удален. При загрузке файла сохранения вы m_name
найдете подходящего участника и не найдете соответствия. Ваш код может просто перейти к следующему члену в файле без сбоев. Это позволяет вам удалять элементы данных, не беспокоясь о повреждении старых файлов сохранения.
Точно так же, если вы добавляете новый тип элемента данных и пытаетесь загрузить из старого файла сохранения, ваш код может просто не инициализировать новый элемент. Это может быть выгодно: новые члены данных могут быть вставлены в файлы сохранения во время исправления вручную, возможно, путем введения значений по умолчанию (или с помощью более интеллектуальных средств).
Этот формат также позволяет легко манипулировать сохраняемыми файлами или изменять их вручную; порядок, в котором элементы данных на самом деле не имеют ничего общего с достоверностью процедуры сериализации. Каждый член просматривается и инициализируется независимо. Это может быть тонкостью, которая добавляет немного дополнительной прочности.
Все это может быть достигнуто с помощью некоторой формы интроспекции. Вы захотите иметь возможность запрашивать элемент данных путем поиска строк и иметь возможность определить, какой фактический тип данных является элементом данных. Это может быть достигнуто в C ++ с использованием формы пользовательского самоанализа, а в других языках могут быть встроены средства самоанализа.