0

应用程序的 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];

有任何想法吗?

4

1 回答 1

1

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

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

我希望这会有所帮助!

于 2009-06-23T03:26:02.250 回答