1

我在为 iPhone 应用程序生成数据的 Mac OS X 程序中使用 NSKeyedArchiver。我发现默认情况下,生成的档案比我预期的要大得多。例子:

NSMutableArray * ar = [NSMutableArray arrayWithCapacity:10];

for (int i = 0; i < 100000; i++) {
    NSString * s = [NSString stringWithFormat:@"item%06d", i];
    [ar addObject:s];
}
[NSKeyedArchiver archiveRootObject:ar toFile: @"NSKeyedArchiver.test"];

这存储了 10 * 100000 = 1M 字节的有用数据,但结果文件的大小几乎是 3 兆字节。开销似乎随着数组中项目的数量而增长。在这种情况下,对于 1000 个项目,文件大约为 22k。

“file”报告它是“Apple 二进制属性列表”(不是 XML 格式)。

有没有一种简单的方法可以防止这种巨大的开销?我想使用 NSKeyedArchiver 因为它提供的简单性。我可以将数据写入我自己的非通用二进制格式,但这不是很优雅。此外,将数据聚合成大块并将它们提供给 NSKeyedArchiver 应该可以工作,但同样,这有点超过了使用简单&easy&ready to use archiver 的意义。我是否错过了一些可以减少这种开销的方法调用或使用模式?

4

1 回答 1

3

我提交了一个错误来跟踪这个。

除此之外,NSKeyedArchiver 是为归档对象网络而设计的。就像,如果一个对象在图表中出现两次,在取消归档时你仍然会发现这种情况。您可能会看到这种独特的开销。

对于与任意对象网络相反的分层结构化数据,请尝试 NSPropertyListSerialization。我看到一个二进制 plist 有 1.8MB。

于 2010-05-06T20:14:31.267 回答