2009-09-06 78 views
0

有人在IRC上告訴我,我可以直接從plist文件創建客觀的c對象,這樣我就不必在任何地方爲plist的序列化/反序列化指定字符串。如何直接從plist文件創建客觀的c對象?

有誰知道如何做到這一點?

我想只是有這樣

<array> 
    <object> 
    <id>my unique id</id> 
    <description>first items description</description> 
    </object> 
</array> 

一個plist,以某種方式反序列化直接進入目標C對象這無需指定文本字符串「描述」或代碼的任何地方「ID」。

這可能是不可能的,但我找不到任何地方在線或在所以做到這一點,或說這是不可能的。

此外,我想跟蹤IRC上的那個人說什麼,但是沒有時間在那裏問他。

任何幫助是極大的讚賞,

-Vandelizer

回答

4

你要找的類的序列。蘋果有一個指南here它的對象檔案方法。一些用於搜索的關鍵字是「歸檔」,「NSCoder」和「序列化」。

基本上你想讓你的類實現NSCoding接口。然後創建方法-(void)encodeWithCoder:(NSCoder*)coder- (id)initWithCoder:(NSCoder *)coder。前者用於寫入數據,後者則用數據創建對象。請參閱「編碼和解碼對象」部分,瞭解如何實現這些方法。

然後,當你想要寫入一個文件時,你需要創建一個NSArray對象,然後調用[NSKeyedArchiver archiveRootObject:toFile:]將該數組寫入文件,然後[NSKeyedUnarchiver unarchiveObjectWithFile:]來讀取該文件。

1

值得注意的是有兩種歸檔方式;一個「愚蠢」的東西,它只是堅持了對象圖,還有一個「鍵」,允許數據結構隨着時間的推移而發展。因爲您可以將存儲元素類型與持久存儲時間分開,所以鍵控歸檔器是更好的選擇(也是首選)。

1

您可能會也可能不會查找對象的序列化。如果您想讀取XML plist中的值,並且其中的值都是有效的plist類型,那麼只需將XML抽取到NSString中,然後發送一個-propertyList消息。你會得到一個id,其類型將取決於問題中plist的內容。

  • (ID)對propertyList 解析所述接收器爲一個屬性列表的文本表示,返回一個NSString,NSData的,NSArray中,或NSDictionary的目的,根據最上面的元件。
2

plist根據定義包含以下任何類型:數組,字典,字符串,實數,整數,布爾值,日期和數據)。如果你使用真正的plist,你可以用一行代碼實例化它包含的對象。見NSPropertyListSerialization方法:

propertyListFromData:mutabilityOption:format:errorDescription

二進制的Plist,可以包含任何對象,並可以書面和使用的NSKeyedArchiver和NSKeyedUnarchiver閱讀。要使用這些,你必須採用NSCoding協議,這裏是一個從NSObject繼承的對象中的這些方法的例子,它有兩個屬性:userId和userEmail。

+ (void) initialize 
    { 
     [self setVersion:1]; // increment when you object format changes (add or remove properties) 
    } 

    - (id) initWithCoder:(NSCoder *)coder 
    { 
     if (self = [super init]) 
     { 
      NSInteger storedClassVersion = [coder versionForClassName:NSStringFromClass([self class])]; 
      self.userId = [coder decodeObjectForKey:@"userid"]; 
      self.userEmail = [coder decodeObjectForKey:@"useremail"]; 
      if (storedClassVersion > 1) 
      { 
       // Use this block to conditionally read properties in versions greater than 1 
      } 
     } 
     return self; 
    } 

    - (void) encodeWithCoder:(NSCoder *)coder 
    { 
     [coder encodeObject:self.userId forKey:@"userid"]; 
     [coder encodeObject:self.userEmail forKey:@"useremail"]; 
    } 

歸檔時,我發現將所有要保存的對象包裝在NSDictionary中是很有用的。這使您可以在解壓時按鍵查找單個對象。 NSDictionary支持NSCoding協議,使它很容易實現。