Ч.1. СЕМАНТИКА
В первой части я говорил что поддерживать обратную совместимость для игр нет смысла, потому что API нет.
Исключение — профиль игрока. Его обратную совместимость мы должны обеспечивать всегда.
Страшный сон для игрока — потеря прогресса.
Страшный сон любого проекта — ошибки с локальным профилем игрока.
Если профиль не синхронизирован с сервером, а игрок потратил деньги, то можно ловить кучу 1 ⭐️ в сторах, возвращать всем деньги и смело ставить свечку за упокой проекта 🕯
Чтобы сон не стал явью нужно позаботиться о миграциях профиля игрока.
Миграция — преобразование данных формата одной версии в формат другой.
Пример:
- Профиль игрока версии 1.0.0 —
{ “coins”: 100 }
- Переименовали coins в soft, версия 1.1.0 — { "soft":100 }
- Объединили поля с валютами в объект, версия 1.2.0 —{ "bank": { "soft":100, "hard":10 } }
Если не будет миграции игрок получит ошибку десериализации при запуске игры после обновления. Потому что json schema между версиями разная.Решение:
Json файл нужно версионировать. При изменении схемы (поломке обратной совместимости), писать миграции.
Задача сводится к тому чтобы написать свой JsonConverter, который будет брать все объекты миграции с версии k до n и вызывать их методы.
Где k - версия json у пользователя, n - версия json в проекте
Типичная ошибка:
Десериализовать файл в старый формат, мигрировать, сохранять и снова десериализовать в новый формат.
Как ни странно, встречал такое решение в нескольких проектах. Это костыль, не делайте так.
Смотрю на плагин и слышу как это интерпрайзное говно кричит о том чтобы его переписали и упростили.
Давайте 15 👍 этому посту и я за пару недель
Обещание выполнено!
https://github.com/vangogih/FastMigrations.Json.Net
#проект_релиз@UniArchitect