如何将自定义对象取消归档到 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.Foo
和 Orange.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文件在解档时的实际名称是什么并不重要。
我有一个对象,我们使用 NSKeyedArchiver
存档为 class Foo
然后我将目标名称从 Apple
更改为 Orange
。它投入生产,用户开始在启动时崩溃。但不是所有的。日志指向 NSKeyedUnarchiver
我去抓取目标被调用时 Apple
和被调用时 Orange
的存档 Foo
文件,并转换为 xml 以便我可以阅读它。主要和唯一的区别(我认为)是 classname
键分别是 Apple.Foo
和 Orange.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文件在解档时的实际名称是什么并不重要。