2009-09-06 45 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协议,使它很容易实现。