【发布时间】:2015-01-28 16:26:17
【问题描述】:
我使用的是 Archiver 版本,但遇到了问题。
在我的项目的以前版本中,一个类 Challenge 被序列化到磁盘
//v1.0
@interface Challenge : NSObject<NSCoding>
{
...
@property (nonatomic,strong) NSString *challengeId;
@property (nonatomic,strong) NSString *title;
@property (nonatomic) BOOL isCompleted;
...
}
现在,在应用程序的 1.1 版中,希望通过添加两个新的@properties 来更改 Challenge 对象。
//v1.1
@interface Challenge : NSObject<NSCoding>
{
...
@property (nonatomic,strong) NSString *challengeId;
@property (nonatomic,strong) NSString *title;
@property (nonatomic) BOOL isCompleted;
...
@property (nonatomic) BOOL isActive;
@property (nonatomic) NSInteger completeCount;
}
我的问题是,当 Archiver 尝试解码 Challenge 对象时,因为存在两个新属性(例如 Challenge v1.1 与 copy 或 alloc 不匹配Challenge v1.0 的模式)然后抛出异常。
基本上,有没有人迁移了一个 NSEncoding 对象并遇到了类似的情况,您采用了哪些技术来解决这个问题?
我考虑过的选项
到目前为止,我已尝试在对象树中的 Challenge 上方插入一个超类,但无法使其发挥作用。
另外,我考虑过使用两步迁移,即版本 v1.1,它以旧格式解码持续存在的挑战,并持续存在一种新类型的对象 NewChallenge 为 v1.2 做准备 -这对我来说似乎过于复杂(考虑到我只想添加两个属性)。
我考虑过扩展 Challenge 并让属性存在于子类中,但这意味着要更改大量期望看到 Challenge 对象的代码。
任何见解将不胜感激。
【问题讨论】:
标签: ios migration nscoding nskeyedarchiver object-persistence