【问题标题】:Is it possible to decode a NSKeyedArchived collection containing unknown objects是否可以解码包含未知对象的 NSKeyedArchived 集合
【发布时间】:2016-02-11 01:12:42
【问题描述】:

我有一组具有不同类 A、B 和 C 的对象(都共享一个共同的超类):

// Encoded collection
@[A, B, C]

此集合通过 NSCoding 存档和取消存档。 如果其中一个类已从项目中删除,是否有办法部分取消归档此集合

似乎decodeObjectForKey: 遇到无法解码的对象时失败并返回nil 对象。有没有办法只获取能够解码的内容?我理解为什么这种行为对对象有意义,但对集合没有意义。

// Expected decoding when A class definition is missing:
@[B, C]

// Actual:
nil

【问题讨论】:

    标签: ios nscoding nskeyedarchiver nskeyedunarchiver nssecurecoding


    【解决方案1】:

    如果类名和你想使用的类是已知的,那么你可以使用NSKeyedUnArchiversetClass:forClassName:方法来指定一个翻译,所以你可以使用类似[unarchiver setClass:MySuperClass.class forClassName:@"C"]的东西

    【讨论】:

    • 如果不是迁移而是硬折旧并删除未归档的类怎么办?我可以尝试使用已删除的类超类 setClass 吗?
    • 是的,这就是我在回答中所展示的内容——MySuperClass 将为存档中的任何 Class C 对象实例化
    • 有没有办法在不知道可能无法识别的特定类的情况下做到这一点?我的问题是旧版本接收包含来自较新版本的对象的存档,该对象使用旧版本无法识别的类。
    • 没有。您要么需要在删除不推荐使用的类时通过添加翻译来确保较新的代码显式处理较旧的档案,要么只需保留不推荐使用的类但不使用它们;向后兼容性是为什么使用不推荐使用的 API 通常是警告而不是错误
    • 好的,谢谢,有道理。听起来我想做的事情是不可能的。 (._.)
    猜你喜欢
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多