Ios 无法解码类Employee的对象的密钥(NS.object.0);该类可以在源代码或未链接的库中定义

Ios 无法解码类Employee的对象的密钥(NS.object.0);该类可以在源代码或未链接的库中定义,ios,objective-c,watchkit,nskeyedarchiver,nskeyedunarchiver,Ios,Objective C,Watchkit,Nskeyedarchiver,Nskeyedunarchiver,我试图通过序列化数组将iPhone上的“雇员”对象数组传递给Apple Watch: NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:employees]; 并像在手表上一样对其进行非序列化: NSMutableArray *employees = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject]; 这是“雇员”类: @interface

我试图通过序列化数组将iPhone上的“雇员”对象数组传递给Apple Watch:

NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:employees];
并像在手表上一样对其进行非序列化:

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

我必须对手表进行任何更改才能修复此错误吗?

因此我遇到了完全相同的问题,答案很简单,但自己很难找到

您只需使用:

  • NSKeyedArchiver.setClassName(“Employee”,代表:Employee.self)

    在序列化之前
  • NSKeyedUnarchiver.setClass(Employee.self,forClassName:“Employee”)

    在反序列化之前
在需要的地方


看起来iOS扩展在类名前面加上了扩展名。

Teriehina的回答让我了解了其中的一部分;我可以归档和取消归档以清理设备,但在尝试取消归档现有归档时仍会出现上述错误

最终我发现了这个问题: ,该用户:

DemoNote
从应用程序移动到框架中确实会更改模块名称,这意味着由于名称不匹配,
nskeyedunachiver
无法找到已存档类的实例


他的解决方案是在
类名
字符串前面加上旧项目的名称(例如,如果项目名为
“CompanyDirectory”
,则使用
“CompanyDirectory.Employee”
,而不是仅使用
“Employee”
)这是我所需要的,以便能够从移动到新创建的链接框架中的模型中取消归档数据。

对我来说,这发生在我的Today扩展中。修正的是在声明之前添加@objc(MyExampleClass)

@objc(MyExampleClass)
open class MyExampleClass {
....
}

似乎执行解码的代码不知道
Employee
类。它正在被编译成手表吗?是的。我必须显示Watch上的员工列表确保在Watch目标中添加了Employee类,并且它符合NSCoding协议。的可能副本您是否意识到托管对象不能传递到另一个线程、托管对象上下文或设备?谢谢。将大型应用程序从objc升级到swift的乐趣。没错,在同一“上下文”(就像在同一应用程序中一样)中存档/取消存档可以很好地工作,而不需要做任何事情。我在从App1将对象归档到通用粘贴板中,并在App2中从粘贴板获取数据时遇到问题。对于这个用例,我必须将类设置为@teriehina。