如何将自定义对象取消归档到 Swift 中的自定义 class 以外的对象

How to unarchive custom object to something other than custom class in Swift

我有一个对象,我们使用 NSKeyedArchiver 存档为 class Foo

然后我将目标名称从 Apple 更改为 Orange。它投入生产,用户开始在启动时崩溃。但不是所有的。日志指向 NSKeyedUnarchiver

我去抓取目标被调用时 Apple 和被调用时 Orange 的存档 Foo 文件,并转换为 xml 以便我可以阅读它。主要和唯一的区别(我认为)是 classname 键分别是 Apple.FooOrange.Foo

如何获取其中一个存档文件并检查其存档的 class 名称?

如果我这样做 NSKeyedUnarchiver.unarchiveObject(withFile: path) as? Foo 它会崩溃。

理想情况下我会这样:

let object = NSKeyedUnarchiver.unarchiveObject(withFile: path) as? [String : Any] 
let name = object!["classname"]!
if name == "Apple.Foo" {
    //delete the cache and let it rebuild
}

但显然不是这样的。关于如何检查我是否有损坏的文件并在应用程序不崩溃的情况下删除它有什么想法吗?

感谢您的帮助!

在过去的几天里,我了解到您可以同时为解压器设置两个不同的 class 名称,它们都可以工作:

NSKeyedUnarchiver.setClass(Foo.classForKeyedUnarchiver(), forClassName: "Apple.Foo")
NSKeyedUnarchiver.setClass(Foo.classForKeyedUnarchiver(), forClassName: "Orange.Foo")

现在 class文件在解档时的实际名称是什么并不重要。