应用程序的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];
有什么想法吗?
答案 0 :(得分:1)
我认为这里的技巧是使用NSKeyedUnarchiver提供的setClass:forClassName:函数。它允许您说:“使用类TownHouse反序列化所有类House的实例。”
然后你需要修改你的TownHouse的initWithCoder:函数来解码任何一个层次结构。您可以通过调用decodeObject或decodeObjectForKey来完成此操作:然后使用isKindOfClass:来查看您正在处理的对象类型。您还可以使用containsValueForKey:在尝试读取某些键之前检查它们。
我希望有所帮助!