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

时间:2016-05-04 12:42:50

标签: ios objective-c watchkit nskeyedarchiver nskeyedunarchiver

我试图传递一批“员工”#39;通过序列化数组将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端进行任何更改才能修复此错误?

3 个答案:

答案 0 :(得分:33)

所以我只是遇到了同样的问题,答案很简单,但有点难以自己找到。

您只需使用:

  • NSKeyedArchiver.setClassName("Employee", for: Employee.self)
    在序列化之前
  • NSKeyedUnarchiver.setClass(Employee.self, forClassName: "Employee")
    在反序列化之前

在任何需要的地方。

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:1)

teriiehina的回答让我成为那里的一部分;我可以归档和取消归档以清理设备,但在尝试取消归档现有归档时仍会出现上述错误。

最终我发现了这个问题: Added a custom framework, now Swift can't unarchive data,用户answered himself

  

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

他将旧项目名称加前缀为className字符串的解决方案(例如,如果项目被称为"CompanyDirectory"然后使用"CompanyDirectory.Employee"而不是"Employee")是什么我需要能够从我的模型中取消归档我的数据,这些数据已被移植到新创建的链接框架中。