使用NSKeyedUnarchiver解码含NSMeasurement的NSArray报错及解决问询
关于NSKeyedArchiver解码含NSMeasurement的NSArray的问题
为什么unarchivedObject(ofClass:)静态方法失效
当你调用unarchivedObject(ofClass: NSArray.self)时,安全编码机制仅信任顶层对象为NSArray,但不会自动授权数组内部嵌套的NSMeasurement类型。错误信息明确显示允许的类只有NSArray,解码时遇到未被信任的NSMeasurement,因此触发4864错误。这是安全编码的设计限制,用来防止恶意数据注入未知类的对象。
仅用静态方法解决的方案
可以使用NSKeyedUnarchiver的另一个静态方法unarchivedObject(ofClasses:from:),传入包含所有需要信任的类的集合(包括顶层的NSArray和内部的NSMeasurement),即可完成正确解码。
修改后的测试代码如下:
func testEncode() throws { let original: NSArray = [NSMeasurement(doubleValue: 42, unit: UnitMass.grams)] let data = try NSKeyedArchiver.archivedData(withRootObject: original, requiringSecureCoding: true) // 指定允许的类集合:NSArray 和 NSMeasurement let allowedClasses = [NSArray.self, NSMeasurement.self] let nsArray = try NSKeyedUnarchiver.unarchivedObject(ofClasses: allowedClasses, from: data) XCTAssertEqual(original, nsArray) }
这个方法依然属于NSKeyedUnarchiver的静态API,满足你“仅用该静态方法”的要求,同时解决了嵌套类的信任问题。
内容的提问来源于stack exchange,提问作者pkamb
相关产品推荐
相关产品推荐

