当对象的属性在归档和取消归档过程之间发生变化时,我与NSKeyedArchiver和NSKeyedUnarchiver有点争执。这是一个具体的例子:
我有一个课程,比方说Task
,它有属性name
和desc
,属于NSString
类型。现在,我使用NSKeyedArchiver archivedDataWithRootObject
进行存档并将其写入文件。我可以稍后从文件中读取它并使用NSKeyedUnarchiver unarchiveObjectWithData(data)
来回到我想要的位置。问题出现在Task
获得一个新属性的时候,为了让事情变得有趣,就会失去一个。
现在,Task
有name
,NSString
,但desc
丢失。此外,我添加了dateDue
类型的属性NSDate
。然后启动模拟器。问题在于,未归档的内容是具有旧Task
属性的旧desc
,而不是新dateDue
。
我的initFromCoder
实际上考虑了这一情况,其中当前类中不存在属性,并且不尝试对其进行解码。
有一种方法来解释的NSCoder方法不创建我的对象的精确复制品,因为它是当我序列(我意识到,是序列化/反序列化的定义的一部分),而是以允许我的版本的灵活性?
由于
答案 0 :(得分:1)
有一种简单的方法 - 将版本写入数据并将其作为initFromCoder
的开头读取。如果版本比较失败,只需从初始化程序返回nil
。
添加属性时,即使您尝试解码数据,也只会获得nil
值。您始终可以检查nil
值。
删除属性时,应该没有任何问题。
请注意,您是实现编码和解码的人,因此您可以以任何方式实现它。