#ios #nskeyedarchiver #nskeyedunarchiver #nssecurecoding
#iOS #nskeyedarchiver #nskeyedunarchiver #nssecurecoding
Вопрос:
Я обновляю старое приложение Objective C, которое использует ‘NSKeyedUnarchiver unarchiveObjectWithData’, которое теперь устарело. Приложение архивирует массив, состоящий из пользовательских объектов, которые содержат (среди прочего) другой массив другого пользовательского объекта. Я реализовал NSSecureCoding в файлах .h 2 объектов и добавил переопределение ‘ (BOOL) supportsSecureCoding’ в обоих файлах .m.
Мой обновленный код архивирования корректно работает со старым устаревшим методом NSKeyedUnarchiver unarchiveObjectWithData:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.myArray
requiringSecureCoding:YES
error:amp;error];
BOOL success = [data writeToFile:pathToArchiveFile
options:NSDataWritingAtomic
error:amp;error];
Однако с моим обновленным кодом разархивирования я получаю сообщение об ошибке
NSData *data = [NSData dataWithContentsOfFile: pathToArchiveFile
options:NSDataReadingMappedIfSafe
error:amp;error];
self.myArray = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSArray class]
fromData:data
error:amp;error];
Ошибка
..."value for key 'NS.objects' was of unexpected class 'MyClass... Allowed classes are '{( "NSArray...
Если я изменюсь на unarchivedObjectOfClass:[MyClass class]
ошибку ..."value for key 'root' was of unexpected class 'NSArray...Allowed classes are '{( "MyClass...
Что-то идет не так с разархивированием массивов, содержащих пользовательские классы, но я не вижу, как это исправить, и доступная документация довольно слабая. Я предполагаю, что код архива правильный, поскольку устаревший метод unArchive, похоже, работает с ним корректно.
Комментарии:
1. Все еще борюсь с этим и надеюсь, что кто-то знает, как это работает