Я разрабатываю мобильную кросс-платформенную игру (iOS, Android, WP8) с помощью MonoGame & Xamarin. У меня есть класс под названием PlayerData, который содержит данные, такие как высокий балл и другие статистические данные. Я пишу и читаю его с помощью XmlSerializer. После выпуска игры предположим, что я меняю базовый класс PlayerData, добавляю новые поля и удаляю некоторые существующие, а затем снова выпускаю его как обновление. Удастся ли XmlSerializer успешно прочитать сохраненные XML-данные предыдущей версии, которая не соответствует точно обновленному классу PlayerData? при каких условиях он потерпит неудачу? Вы посоветуете лучшую альтернативу будущим проектам?
Сам XmlSerializer
очень мало заботится об изменениях. Если он не может сериализовать свойство в классе, данные игнорируются. Вам решать, как обрабатывать миграции с PlayerData
версии 1.0 до 2.0.
Я бы рекомендовал связать номер версии с вашим классом PlayerData
. Теперь вы можете отслеживать, какую версию PlayerData
пытается загрузить ваше приложение. Если это версия 1.0, а теперь вы в 2.0, вам нужно написать логику для переноса любых свойств, содержащих данные, которые вы хотите сохранить. Как вы делаете фактическую миграцию, зависит от вас.
Например, после выпуска обновленного класса PlayerData
простым способом реализации этой миграции является создание другого класса под названием PlayerDataV1
. PlayerDataV1
можно настроить так же, как PlayerData
, или даже наследовать PlayerData
. Теперь во время загрузки профиля вы можете выполнить десериализацию профилей версии 1.0 в этом классе и перенести их в новую структуру классов, используя методы миграции, созданные в PlayerDataV1
.