4

我需要能够比较使用 NSKeyedArchiver 创建的 plist 文件的两个版本。特别是,它是在 Xcode 中为 .xcdatamodeld 文件创建的“元素”文件。

由于我自己没有创建这个文件,我无法重新创建它的对象模型。相反,我需要了解存档包含哪些类和键控属性。

理想情况下,我想创建一个树,其中包含表示类名称及其属性名称和值的字符串。我假设所有这些信息都存储在档案中,所以应该可以一般地解析这个档案,对吧?

我读过 NSKeyedUnarchiver 及其代表。我只得到了这样的:

解压文件数据:

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
unarchiver.delegate = self;
id graph = [unarchiver decodeObjectForKey:@"root"];

这是请求未知类时调用的委托方法。我在这里返回一个代理类,我希望在其中收集它的值:

- (Class)unarchiver:(NSKeyedUnarchiver *)unarchiver cannotDecodeObjectOfClassName:(NSString *)name originalClasses:(NSArray *)classNames
{
    NSLog(@"wants: %@", name);
    return [ObjProxy class];
}

代理类实现

- (id)initWithCoder:(NSCoder *)aDecoder

我不知道如何进行,不知道类的实际属性。NSCoder 似乎没有提供任何学习可用键的功能。是否有一个技巧来获得它们,也许是通过覆盖一些较低级别的 objc 方法?

到目前为止,通过上面显示的这个小代码,在解析“元素”文件时,我只得到了一个类的请求,“XDPMModel”,然后就完成了。

任何想法如何让这个工作,即更深入地遍历树?

4

2 回答 2

6

您可以使用PlistExplorer,它是一个 Cocoa 工具来检查由 NSKeyedArchiver 编写的文件。

于 2011-08-11T09:21:38.303 回答
2

我以前就这样做过,对存储在 Panic's Coda 的首选项文件中的对象进行解码。我所做的是在应用程序上使用类转储(在您的情况下为 Xcode 及其相关框架),它允许您查看真实对象的属性,并使用这些来创建与这些属性匹配的代理对象。然后,您可以NSKeyedUnarchiver成功使用并查询代理对象的值。

这是一个相当费力的过程,但效果很好。在我的例子中,我使用的是用户默认 plist,所以我只需要为我感兴趣的对象定义几个代理类,但我想你必须为 Xcode 定义很多。

我也很想知道是否有办法做到这一点而不必走这class-dump条路(可能,正如你所说,通过一些较低级别的 Objective-C 函数),因为它会大大简化这种类型的反向工程。

于 2011-08-11T00:29:08.440 回答