无法解码 Employee 类对象的键(NS.object.0);该类可以在源代码或未链接的库中定义
Posted
技术标签:
【中文标题】无法解码 Employee 类对象的键(NS.object.0);该类可以在源代码或未链接的库中定义【英文标题】:Cannot decode object of class Employee for key (NS.object.0); the class may be defined in source code or a library that is not linked 【发布时间】:2016-08-29 22:03:17 【问题描述】:我试图通过序列化数组将“员工”对象数组 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
我是否必须在 Watch 端进行任何更改才能修复此错误?
【问题讨论】:
看起来进行解码的代码不知道Employee
类。是否被编译到手表端?
是的。我必须在手表上显示员工列表
确保在 Watch 目标中添加了 Employee 类并且它符合 NSCoding 协议。
Can I encode a subclass of NSManagedObject?的可能重复
您是否意识到托管对象不能传递给另一个线程、托管对象上下文或设备?
【参考方案1】:
所以我刚刚遇到了同样的问题,答案很简单,但自己很难找到。
你只需要使用:
NSKeyedArchiver.setClassName("Employee", for: Employee.self)
序列化之前
NSKeyedUnarchiver.setClass(Employee.self, forClassName: "Employee")
反序列化之前
任何需要的地方。
看起来 ios 扩展在类名前加上扩展名。
【讨论】:
谢谢。大型应用从 objc 升级到 swift 的乐趣。【参考方案2】:teriiehina 的回答让我成功了;我可以存档和取消存档以清理设备,但在尝试取消存档现有存档时仍然出现上述错误。
最终我发现了这个问题: Added a custom framework, now Swift can't unarchive data,用户answered himself:
将
DemoNote
从应用程序移动到框架确实会更改模块名称,这意味着NSKeyedUnarchiver
由于名称不匹配而无法找到存档类的实例。
他的解决方案是将旧项目的名称添加到 className
字符串前(例如,如果项目名为 "CompanyDirectory"
,则使用 "CompanyDirectory.Employee"
而不是仅使用 "Employee"
)是我解压缩我的我的模型中的数据已被移动到新创建的链接框架中。
【讨论】:
你是对的,在同一个“上下文”(就像在同一个应用程序中)内归档/取消归档工作得很好,什么都不做。我在将对象从 App1 存档到通用粘贴板并取消存档从 App2 中的粘贴板获取数据时遇到问题。对于这个用例,我必须按照@teriiehina 所说的那样设置类。【参考方案3】:对我来说,这发生在我的 Today 扩展中。解决方法是在声明之前添加 @objc(MyExampleClass)。
@objc(MyExampleClass)
open class MyExampleClass
....
【讨论】:
以上是关于无法解码 Employee 类对象的键(NS.object.0);该类可以在源代码或未链接的库中定义的主要内容,如果未能解决你的问题,请参考以下文章
-[NSKeyedUnarchiver decodeObjectForKey:]:无法解码类的对象