使用Obj-C / iPhone SDK以XML格式进行对象序列化

时间:2010-07-20 16:51:34

标签: iphone objective-c serialization xml-serialization plist

我有一个使用相对少量数据的iPhone应用程序。 我想以XML格式保存数据,并能够将其加载到Objective-C对象的内存中。我想使用iPhone SDK工具,如 NSPropertyListSerialization writeToFile:atomically:类和方法。

NSPropertyListSerialization documentation

  

NSPropertyListSerialization类   提供转换属性的方法   列出来自几个的对象   序列化格式。物业清单   对象包括NSData,NSString,   NSArray,NSDictionary,NSDate和   NSNumber对象。

假设我想保存几个属性都是属性列表类型 Person 对象(一个系列)。我设法以XML格式保存它的唯一方法是:

// container for person objects
NSMutableArray *family = [[NSMutableArray alloc] init];

for (int i = 0; i < numberOfPeople; i++) {      
 // simulate person's attributes
 NSArray *keys = [[NSArray alloc] initWithObjects:
       @"id", 
       @"name",
       @"age",
       Nil];

 NSArray *values = [[NSArray alloc] initWithObjects:
         [NSNumber numberWithInt:i],
         @"Edward", 
         [NSNumber numberWithInt:10],
         Nil];

 // create a Person (a dictionary)
 NSDictionary *person = [[NSDictionary alloc] initWithObjects:values forKeys:keys];
 [family addObject:person];
 [person release];  
}

// save the "person" object to the property list
[family writeToFile:@"<path>/family.plist" atomically:YES];
[family release];

将生成family.plist文件。

但请注意,我的 Person 对象实际上是一个NSDictionary对象(我不认为子类化是一个好主意),属性作为键。 有没有办法像这样创建一个Objective-C类:

@interface Person : NSObject {
 NSString *_id; 
 NSString *_name;
 NSNumber *_age;
}
@end

并将其序列化为plist / XML文件? (我需要以文本格式(不是二进制)保存对象,以便我可以在文本编辑器中编辑这些数据,并允许我的应用程序在运行时加载它,通常转换为Objective-C对象。

提前致谢, 爱德华

2 个答案:

答案 0 :(得分:4)

如果您还没有阅读过,我强烈推荐Archives and Serializations Programming Guide,特别是有关使用NSCoding协议编码和解码对象的部分。

如果使用该协议,您的对象将存储为NSData。但你可以模仿它(即创建自己的协议),以便你的类返回自己的字典表示,并可以从字典表示初始化自己(我认为没有办法自动执行此操作)。但是,结果基本上与您发布的family.plist文件相同。

如果您正在寻找获取这样的XML文件的方法:

<person>
    <id>0</id>
    <name>Edward</name>
    <age>10</age>
</person>

然后plist不是你想要的。

答案 1 :(得分:0)

我很惭愧地说我使用[NSString stringWithformat:]来制作XML文档。这是迄今为止我发现的最简单的方法。