gpt4 book ai didi

ios - 如何将 NSCoder 与版本化类一起使用

转载 作者:行者123 更新时间:2023-11-29 13:24:58 27 4
gpt4 key购买 nike

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

我有一个类,比如说Task,它有namedesc属性,都是NSString<类型。现在,我使用 NSKeyedArchiver archivedDataWithRootObject 进行存档并将其写入文件。稍后我可以从文件中读取它并使用 NSKeyedUnarchiver unarchiveObjectWithData(data) 立即回到我想去的地方。当 Task 获得一个新属性并且为了让事情变得有趣而失去一个时,问题就来了。

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

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

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

谢谢

最佳答案

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

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

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

请注意,您是同时实现编码和解码的人,因此您可以按照自己的方式实现它。

关于ios - 如何将 NSCoder 与版本化类一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13370123/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com