You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 02:12:41