Как использовать NSCoder с версионными классами

У меня возникают проблемы с NSKeyedArchiver и NSKeyedUnarchiver, когда свойства объекта меняются между процессом архивирования и разархивирования. Вот конкретный пример:

У меня есть класс, скажем, Task, и у него есть атрибуты name и desc, оба типа NSString. Теперь я архивирую с помощью NSKeyedArchiver archivedDataWithRootObject и записываю в файл. Позже я могу прочитать его из файла и использовать NSKeyedUnarchiver unarchiveObjectWithData(data), чтобы вернуться туда, где я хочу быть. Проблема возникает, когда Task приобретает новое свойство и, что еще интереснее, теряет одно.

Итак, теперь у Task есть name, то есть NSString, но desc отсутствует. Далее добавляю свойство dateDue типа NSDate. А потом запустить симулятор. Проблема в том, что разархивировано старое Task со старым свойством desc, но не новое dateDue.

Мой initFromCoder фактически учитывает случай, когда свойство отсутствует в текущем классе, и не пытается его декодировать.

Есть ли способ объяснить методам NSCoder не создавать мне точную копию объекта, как это было, когда я его сериализовал (я понял, что это часть определения сериализации/десериализации), а скорее предоставить мне гибкость для версии Это?

Спасибо


person Steve Ross    schedule 13.11.2012    source источник


Ответы (1)


Есть один простой способ — записать версию в данные и прочитать как начало initFromCoder. Если сравнение версий не удается, просто верните nil из инициализатора.

Когда вы добавляете свойство, даже если вы пытаетесь декодировать данные, вы просто получаете значение nil. Вы всегда можете проверить значения nil.

Когда вы удаляете свойство, не должно быть никаких проблем.

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

person Sulthan    schedule 14.11.2012