Невозможно декодировать объект класса 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") было то, что мне нужно было, чтобы иметь возможность разархивировать мои данные из моей модели, которая была перемещена во вновь созданную связанную платформу.

Другие вопросы по тегам