Невозможно декодировать объект класса Employee для ключа (NS.object.0); класс может быть определен в исходном коде или библиотеке, которая не связана
Я пытаюсь передать массив объектов "Сотрудник" iPhone в Apple Watch путем сериализации массива:
NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:employees];
и десериализация его как со стороны Watch:
NSMutableArray *employees = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject];
Это класс "Сотрудник":
@interface Employee : NSManagedObject
@property (nonatomic, retain) NSNumber * employeeID;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * age;
@property (nonatomic, retain) NSString * address;
@property (nonatomic, retain) NSString * designation;
@property (nonatomic, retain) NSString * teamName;
@property (nonatomic, retain) NSString * gender;
@property (nonatomic, retain) NSNumber * dateOfJoining;
@end
Нужно ли вносить какие-либо изменения на стороне часов, чтобы исправить эту ошибку?
3 ответа
У меня точно такая же проблема, и ответ прост, но сам по себе немного сложен.
Вы просто должны использовать:
NSKeyedArchiver.setClassName("Employee", for: Employee.self)
перед сериализациейNSKeyedUnarchiver.setClass(Employee.self, forClassName: "Employee")
перед десериализацией
где нужно
Похоже, расширения iOS префикс имени класса с именем расширения.
Для меня это происходило в моем расширении Today. Что исправило, так это добавление @objc(MyExampleClass) перед объявлением.
@objc(MyExampleClass)
open class MyExampleClass {
....
}
Ответ Териехины дал мне часть пути туда; Я мог заархивировать и разархивировать, чтобы очистить устройства, но все еще получил вышеупомянутую ошибку при попытке разархивировать существующий архив.
В конце концов я нашел этот вопрос: добавили пользовательский фреймворк, теперь Swift не может разархивировать данные, на которые пользователь сам ответил:
перемещение
DemoNote
из приложения в фреймворк изменил имя модуля, что означало, чтоNSKeyedUnarchiver
не удалось найти экземпляры заархивированного класса из-за несоответствия имени.
Его решение префикса названия старого проекта к className
строка (например, если проект был вызван "CompanyDirectory"
затем с помощью "CompanyDirectory.Employee"
в отличие от просто "Employee"
) было то, что мне нужно было, чтобы иметь возможность разархивировать мои данные из моей модели, которая была перемещена во вновь созданную связанную платформу.