如何使用NSKeyedUnarchiver解归档MLMultiArray?
解决MLMultiArray归档解码失败的问题
错误原因
解码报错的核心是:安全解码模式下,你仅允许了解码Embedding类,但Embedding内部包含的MLMultiArray未被加入允许的类列表,解码器无法信任该未知类,导致校验失败。
解决方案
修改解码方法,将MLMultiArray.self加入unarchivedArrayOfObjects(ofClasses:)的类数组参数中,明确告知解码器信任该类。
修改后的解码代码
private func loadEmbeddingsData(fileName: String) -> [Embedding]? { let filePath = self.getDocumentsDirectory().appendingPathComponent(fileName) do { let data = try Data(contentsOf: filePath) // 新增MLMultiArray到允许解码的类列表 let embeddings = try NSKeyedUnarchiver.unarchivedArrayOfObjects(ofClasses: [Embedding.self, MLMultiArray.self], from: data) as? [Embedding] return embeddings } catch { print("error is: \(String(describing: error))") } return nil }
补充说明
MLMultiArray本身已遵循NSSecureCoding协议,无需额外实现编码解码逻辑,可直接加入允许列表。- 安全解码要求所有参与归档的自定义类、嵌套系统类都必须被明确指定,否则会触发类校验失败错误。
内容的提问来源于stack exchange,提问作者MazzzyStar
相关产品推荐
相关产品推荐

