1

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

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

所以现在,Taskhas name,这是一个NSString,但是desc不见了。此外,我添加了dateDuetype的属性NSDate。然后启动模拟器。问题是未归档的是 oldTask具有 olddesc属性,而不是 new dateDue

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

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

谢谢

4

1 回答 1

1

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

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

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

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

于 2012-11-14T00:07:56.093 回答