应用程序的1.0版具有数据模型,使用NSKeyed(Un)Archiver类保存/加载,因为所有模型类都遵循NSCoding协议。假设存在以下层次结构:

-> Houses (NSMutableArray)
-> -> House (Custom Object)
-> -> -> Color (3 ints, RGB)
-> -> -> Number of Residents (int)

假设存在以这种方式存储的旧文件,但需要使用以下较新的数据模型将其加载到应用程序的2.0版中以实现向后兼容性:

-> Neighborhood (Maintains NSMutableArray, among other properties)
-> -> TownHouse
-> -> -> Color (3 ints, RGB)
-> -> -> Occupants (NSMutableArray)
-> -> (Other types of houses)

显然,有些数据会丢失,需要填写。例如。基本的“乘员”需要为每个“居民数量”创建对象。以前存在过。我正在寻找的是一种以编程方式加载以前的数据模型的方法,特别是如果我只有类/层次结构的列表,而不是.m / .h文件本身。

所以我想做的是(假设我有一个Houses.data文件,使用Houses数组序列化):

NSFile *legacyFile;
Neighborhood *hood = [Neighborhood neighborhoodFromLegacyFile:legacyFile];

有什么想法吗?

有帮助吗?

解决方案

我认为这里的技巧是使用NSKeyedUnarchiver提供的setClass:forClassName:函数。它允许您说:“使用类TownHouse反序列化所有类House的实例。”

然后你需要修改你的TownHouse的initWithCoder:函数来解码任何一个层次结构。您可以通过调用decodeObject或decodeObjectForKey来完成此操作:然后使用isKindOfClass:来查看您正在处理的对象类型。您还可以使用containsValueForKey:在尝试读取某些键之前检查它们。

我希望有所帮助!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top