【问题标题】:How to Use NSCoder with Versioned Classes如何将 NSCoder 与版本化类一起使用
【发布时间】:2012-11-02 10:27:15
【问题描述】:

当对象的属性在归档和取消归档过程之间发生变化时,我在使用 NSKeyedArchiver 和 NSKeyedUnarchiver 时遇到了一些问题。这是一个具体的例子:

我有一个类,比如说Task,它具有namedesc 的属性,两者都是NSString 类型。现在,我使用NSKeyedArchiver archivedDataWithRootObject 存档并将其写入文件。稍后我可以从文件中读取它并使用NSKeyedUnarchiver unarchiveObjectWithData(data) 回到我想要的位置。当Task 获得一个新财产,为了让事情变得有趣而失去了一个时,问题就出现了。

所以现在,Taskname,这是一个 NSString,但缺少 desc。此外,我添加了NSDate 类型的属性dateDue。然后启动模拟器。问题是未归档的是旧的Task 和旧的desc 属性,而不是新的dateDue

我的initFromCoder 实际上考虑了当前类中不存在属性并且不尝试对其进行解码的情况。

有没有办法向 NSCoder 方法解释不是像我序列化对象时那样创建对象的精确副本(我意识到这是序列化/反序列化定义的一部分),而是允许我版本的灵活性?

谢谢

【问题讨论】:

    标签: ios versioning nscoder


    【解决方案1】:

    有一种简单的方法 - 将版本写入数据并将其作为initFromCoder 的开头读取。如果版本比较失败,只需从初始化器返回nil

    当您添加一个属性时,即使您尝试解码数据,您也只会得到一个nil 值。您可以随时检查 nil 值。

    当您删除一个属性时,应该不会有任何问题。

    请注意,您是同时实现编码和解码的人,因此您可以以任何您想要的方式实现它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多