Iphone NSArray上的NSKeyedArchiver具有较大的开销

Iphone NSArray上的NSKeyedArchiver具有较大的开销,iphone,macos,overhead,nskeyedarchiver,Iphone,Macos,Overhead,Nskeyedarchiver,我正在Mac OS X程序中使用NSKeyedArchiver,它为iPhone应用程序生成数据。我发现默认情况下,生成的归档文件比我预期的要大得多。例如: NSMutableArray * ar = [NSMutableArray arrayWithCapacity:10]; for (int i = 0; i < 100000; i++) { NSString * s = [NSString stringWithFormat:@"item%06d", i]; [ar

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

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"];
NSMutableArray*ar=[NSMutableArray阵列容量:10];
对于(int i=0;i<100000;i++){
NSString*s=[NSString stringWithFormat:@“项目%06d”,i];
[ar addObject:s];
}
[NSKeyedArchiver archiveRootObject:ar toFile:@“NSKeyedArchiver.test”];
这将存储10*100000=1M字节的有用数据,但生成的文件大小几乎为3M字节。开销似乎随着阵列中项目的数量而增加。在本例中,对于1000个项目,该文件大约为22k

“文件”报告它是“苹果二进制属性列表”(不是XML格式)


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

我提出了一个bug来跟踪这一点

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

对于层次结构数据而不是任意对象网络,请尝试NSPropertyListSerialization。我看到1.8MB的二进制plist

谢谢,你说得对,普利斯特应该做到这一点。我忘了它也有二进制格式。