2010-05-06 19 views
1

我在Mac OS X程序中使用NSKeyedArchiver爲iPhone應用程序生成數據。我發現默認情況下,生成的檔案比我預期的要大得多。示例:NSArray上的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字節的有用數據,但生成的文件的大小几乎是三兆字節。開銷似乎隨着數組中項目的數量而增長。在這種情況下,對於1000個項目,文件大約是22k。

「文件」報告它是「Apple二進制屬性列表」(不是XML格式)。

有沒有簡單的方法來防止這種巨大的開銷?爲了簡單起見,我想使用NSKeyedArchiver。我可以將數據寫入我自己的,非泛型的二進制格式,但這不是很優雅。另外,將數據聚合成大塊並將這些數據提供給NSKeyedArchiver應該可以工作,但同樣,這種方法還是可以使用簡單的&準備好使用歸檔程序。我是否缺少一些方法調用或使用模式來減少這種開銷?

回答

3

我提出了一個錯誤來跟蹤這個。

除此之外,NSKeyedArchiver設計用於歸檔對象網絡。就像,如果一個對象在圖中出現兩次,在取消存檔的情況下,您仍然會發現這種情況。你可能會看到這種統一的開銷。

對於與任意對象網絡相對的分層結構化數據,請嘗試NSPropertyListSerialization。我看到一個二進制plist 1.8MB。

+0

謝謝8)你說得對,plist應該這樣做。我忘了它也有一個二進制格式。 – BobK 2010-05-07 11:29:24