12

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

4

3 回答 3

39

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

您只需使用:

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

任何需要的地方。

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

于 2016-05-11T12:35:03.053 回答
12

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

@objc(MyExampleClass)
open class MyExampleClass {
....
}
于 2018-08-23T11:03:13.963 回答
2

teriiehina 的回答让我成功了;我可以存档和取消存档以清理设备,但在尝试取消存档现有存档时仍然出现上述错误。

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

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

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

于 2018-04-12T12:30:18.647 回答