Існує маса способів вирішити проблему з версією; ви можете зробити це, маючи одну функцію завантаження в кожній версії, ви можете спробувати автоматизувати процес, описуючи (за допомогою атрибутів зазвичай) трансформацію структури активів у часі, ви можете робити перевірку, що залежить від версії всередині функцій завантаження / збереження, тощо. .
Мені подобається підхід "описати зміни", але я вважаю, що намагатися зробити це за допомогою атрибутів стає незручно швидко . Я б замість цього використовував функції; реалізуйте функцію, яка перетворює дані у версії N
до даних у версії N + 1
для всієї відповідної версії. Під час завантаження перевіряйте версію на останню версію, а якщо її немає, запустіть дані через усі відповідні функції версії. Завжди зберігайте останню версію.
Це найкраще спрацьовує, якщо ви перетворитесь, коли дані все ще знаходяться у формі ключ-значення часу виконання. Це означає, що ви, мабуть, захочете запровадити подання для своїх даних, що є підходом до "пакету ресурсів виконання", оскільки ви не можете використовувати базову форму JSON або XML, що має базове значення, якщо у вас є власний бінарний формат. Якщо ви цього не зробите, вам також може знадобитися зберегти старі визначення класу, що стає некрасивим. Можливість мати свої активи в поганому форматі властивості також надзвичайно корисна для розробки редакторів ігор.
Під час розробки, коли ви повторюєте свої дані, вони, природно, перетворюються на останню версію, і ви можете згодом видалити старі функції версій. Це більш-менш той самий підхід на високому рівні, який ми використовували для версії художніх активів (наприклад, карти) в Guild Wars 2.
Тепер, все, що сказано, я думаю, що корисно підтримувати як текстову, так і двійкову серіалізацію для активів. Під час розробки зберігайте всі свої дані у читаному для людини форматі на основі XML або JSON. Це може значно збільшити вашу здатність до ітерації, оскільки не потрібно створювати такі складні інструменти для редагування даних. Ви можете повернутися до можливості робити прості швидкі налаштування вручну.
По-друге, якщо ви навіть все ще хочете двійкового формату для доставки гри (що може поліпшити розмір файлу або час вводу файлу, тому це дійсне бажання), розробіть свої API для серіалізації та десеріалізації для обробки версій. Версія все ще корисна в контексті доставки, тому що, можливо, ви хочете відправити оновлення або виправлення помилок. Існує декілька документів, що описують можливості версії серіалізації .NET та серіалізації Boost, які можуть вам бути цікавими. Якщо будуть йти на підтримку як текст , так і бінарні формати, переконайтеся , що ви перевірити їх час від часу (або будують автоматизовані тести , щоб зробити це, навіть краще).