28

我有一個對象的字典;它們都是應該可序列化的POCO對象。我應該看看將這些寫入磁盤的技術。我正在尋找最簡單的選項來編寫一些列表來保存狀態。如何序列化iPhone SDK中的簡單對象?

我想我有3個選項。

  1. plist文件。然而,這似乎僅限於存儲預定義的對象(字符串,數字等)而不是對象(如具有名稱和年齡的人)。

  2. CoreData。 (3.0中的新功能)這樣可以很好地工作;但是我的數據模型需要改變才能完成這項工作。這將是一次大規模的返工,我不確定是否值得付出努力。

  3. SQLLite。實現一個簡單的SQL數據庫來往來讀取。我已經做了最少量的研究,但我不想'重寫'一些核心數據ORM函數。

回答

14

您可以像在Mac OS X上那樣執行此操作:您的POCO必須符合NSCoding協議。對於概念參考請參閱here,對於NSCoding參考請參閱here

如果數據是不是瘋了廣泛而你沒有你的對象之間的可笑複雜的關係,把每件事寫出來是plist可能是你最好的選擇;它的執行速度非常快,並且在您的代碼中實現起來非常簡單。就像你說的,CoreData可能是額外的工作很多來適應你的代碼和SQLite真的是隻用於存儲數據的完美存儲在關係數據庫中好。請記住,與使用二進制plists相比,sqlite也比較慢並且使用更多的資源。

33

要序列化,你只需要符合NSCoding協議自定義對象。如果你的對象擴展NSObject的所有你需要做的(我認爲)是實現這些(例如對於人對象):

// Encode an object for an archive 
- (void)encodeWithCoder:(NSCoder *)coder 
{ 
    [super encodeWithCoder:coder]; 
    [coder encodeObject:name forKey:@「Name」]; 
    [coder encodeInteger:age forKey:@「Age」]; 
} 
// Decode an object from an archive 
- (id)initWithCoder:(NSCoder *)coder 
{ 
    self = [super initWithCoder:coder]; 
    name = [[coder decodeObjectForKey:@「Name」] retain]; 
    age = [coder decodeIntegerForKey:@「Age」]; 
} 

NSArrayNSDictionary已經實現了系列化的方法。他們會序列化他們持有的所有對象(如果對象實現NSCoder接口 - 它們如果擴展NSObject的話)。 NSObject的encodeWithCoderinitWithCoder默認不做任何事情,所以除非你在你的類中實現自己的代碼,否則沒有任何序列化。

如果你有對象的NSArray或NSDictionary中,你可以使用它們同步:

// Writing 
- (BOOL)writeToFile:(NSString *)aPath atomically:(BOOL)flag; 
- (BOOL)writeToURL:(NSURL *)aURL atomically:(BOOL)flag; 
// Reading 
- (id)initWithContentsOfFile:(NSString *)aPath; 
- (id)initWithContentsOfURL:(NSURL *)aURL; 
+0

名字的NSString類型的對象,所以你要保留,如果你想使用它,年齡只有基本整數 – stefanB 2009-07-28 22:25:50

相關問題