Как изменить иерархию объектов, закодированных в NSKeyedArchiver? - PullRequest
3 голосов
/ 03 января 2012

У нас уже есть игра, в которой есть функция сохранения / загрузки с использованием NSCoding во всех классах.Сейчас мы работаем над следующей версией, но прежде чем мы это сделаем, нам нужно провести рефакторинг кода, чтобы он имел лучшую производительность и было легче реализовать будущие функции (это может сильно измениться).

Проблема после рассмотрения нового дизайна.Иерархия NSCoding отличается от предыдущей версии.

v1.0 GameSavedFile (с использованием NSKeyedArchiver) -> UserData -> User (родительский элемент UserData) -> набор объектов и примитивов

v1.1 Пользователь (используя NSKeyedArchiver) -> набор объектов и примитивов

v1.1 имеет более простую и понятную структуру.В v1.0 UserData является подклассом пользователя, в то время как в v1.1 мы будем использовать только один класс для всех данных пользователя.

Так проще и практичнее.Тем не менее, как я могу портировать все данные v1.0 на v1.1, не нарушая ничего?Я читал, что есть setClassName: forClass: метод, но я думаю, что он заменяет только старый класс на новый класс.

Самый чистый и безопасный способ, который я мог бы придумать, - это проверить, использует ли игра все ещестарая версия (v1.0).Если это произойдет, преобразуйте иерархию NSCoding в plist / dictionary, а затем разбросайте ее по коду v1.1.

Я открыт для любого возможного предложения / решения, но я предпочту решение, которое уже доступно вОснова основы (если это возможно).

Спасибо.

1 Ответ

2 голосов
/ 03 января 2012

Конечно, вы должны прочитать Прямая и обратная совместимость для ключевых архивов , но это не решает ваши проблемы здесь.(Все равно прочтите.)

Если вы еще не отправили v1.1, вот моя рекомендация:

  • Создайте новое имя файла сохранения для v1.1.Я часто включаю номер версии в имя файла, чтобы упростить это.Это позволяет легко определить, какую версию вы пытаетесь прочитать, прежде чем открывать ее.Мне вообще нравится это лучше, чем рекомендация Apple о сохранении версии в файле.(Конечно, если изменение имени файла приводит к путанице пользователя или если пользователь имеет контроль над именем файла, то вам, конечно, следует сохранить версию в файле.)

  • Для файлов v1.0, создайте классы типа V10GameSaveFile, которые просто содержат необработанные данные.Затем используйте setClassName:forClass: для перемещения сериализованных объектов в классы фиктивных классов.

  • Теперь, когда ваша структура находится в памяти, преобразуйте ее в новую объектную модель, повторно сохраните иудалить старый файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...