Есть много способов справиться с проблемой управления версиями; Вы можете сделать это, имея одну функцию загрузки для каждой версии, вы можете попытаться автоматизировать процесс, описав (через атрибуты обычно) преобразование структуры активов с течением времени, вы можете выполнить специфичные для версии проверки внутри функций загрузки / сохранения и т. д. ,
Мне нравится подход «описать изменения», но я считаю, что попытка сделать это с помощью атрибутов быстро становится неловкой . Я бы использовал функции вместо этого; реализовать функцию, которая преобразует данные в версии N
в данные в версии N + 1
для всех ваших соответствующих версий. При загрузке сверяйте версию с последней и, если это не так, пропустите данные через все соответствующие функции управления версиями. Всегда сохраняйте последнюю версию.
Это работает лучше всего, если вы выполняете преобразование, когда данные все еще находятся в форме значения ключа времени выполнения. Это означает, что вы, вероятно, захотите реализовать представление для ваших данных, которое представляет собой подход «мешок свойств среды выполнения», потому что вы не можете использовать базовую форму значения ключа JSON или XML, если у вас есть собственный двоичный формат. Если вы этого не сделаете, вам также может понадобиться сохранить старые определения классов, что выглядит ужасно. Возможность иметь свои активы в этом плохом формате также очень полезна для разработки редактора игр.
Во время разработки, когда вы выполняете итерацию ваших данных, они естественно всплывают до последней версии, и вы можете в конечном итоге удалить старые функции контроля версий. Это более или менее тот же высокоуровневый подход, который мы использовали для создания версий художественных ресурсов (таких как карты) в Guild Wars 2.
Теперь, после всего сказанного, я думаю, что полезно поддерживать как текстовую, так и двоичную сериализацию для ресурсов. Во время разработки сохраняйте все свои данные в удобочитаемом формате на основе XML или JSON. Это может значительно увеличить вашу итерационную способность, потому что вам не нужно создавать такие сложные инструменты для редактирования данных. Вы можете вернуться к возможности делать простые быстрые настройки вручную.
Во-вторых, предполагая, что вам все еще нужен двоичный формат для доставки игры (который может улучшить размер файла или время ввода-вывода, так что это действительно допустимо), разработайте API-интерфейсы сериализации и десериализации для управления версиями. Versioning это еще полезно в контексте доставки, потому что , как какой - то момент вы можете обновления судов или исправления ошибок. Есть некоторые документы , описывающие возможности управления версиями .NET сериализации и сериализации Boost в том , что вы можете найти интересные. Если будут идти на поддержку как текст , так и бинарные форматы, убедитесь , что вы проверить их время от времени (или строят автоматизированные тесты , чтобы сделать это, даже лучше).