如何在版本化类中使用NSCoder

时间:2012-11-13 22:38:07

标签: ios versioning nscoder

当对象的属性在归档和取消归档过程之间发生变化时,我与NSKeyedArchiver和NSKeyedUnarchiver有点争执。这是一个具体的例子:

我有一个课程,比方说Task,它有属性namedesc,属于NSString类型。现在,我使用NSKeyedArchiver archivedDataWithRootObject进行存档并将其写入文件。我可以稍后从文件中读取它并使用NSKeyedUnarchiver unarchiveObjectWithData(data)来回到我想要的位置。问题出现在Task获得一个新属性的时候,为了让事情变得有趣,就会失去一个。

现在,TasknameNSString,但desc丢失。此外,我添加了dateDue类型的属性NSDate。然后启动模拟器。问题在于,未归档的内容是具有旧Task属性的旧desc,而不是新dateDue

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

有一种方法来解释的NSCoder方法不创建我的对象的精确复制品,因为它是当我序列(我意识到,是序列化/反序列化的定义的一部分),而是以允许我的版本的灵活性?

由于

1 个答案:

答案 0 :(得分:1)

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

添加属性时,即使您尝试解码数据,也只会获得nil值。您始终可以检查nil值。

删除属性时,应该没有任何问题。

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