是否可以在Objective-C中将自定义对象序列化为plist文件?

时间:2010-12-31 12:35:49

标签: objective-c serialization plist nscoding

为简单起见,我们假设我们有以下简单的类接口:

@interface Person : NSObject <NSCoding> {
  NSString *firstname;
  NSString *lastname;
}

@property (copy) NSString *firstname;
@property (copy) NSString *lastname;

@end

是否可以将此对象序列化为plist(假设NSCoding协议已正确实现)?

更新2010年12月31日14:40

我对此有一些跟进问题。是否可以将NSKeyedArchiver导出plist作为XML?此外,是否可以将XML转储到变量而不是文件?

5 个答案:

答案 0 :(得分:2)

至于将输出格式设置为XML,我建议:

[myKeyedArchiver setOutputFormat: NSPropertyListXMLFormat_v1_0];

至于将它变成变量而不是文件,我建议使用initForWritingWithMutableData:初始化器创建NSKeyedArchiver。完成编码后, 确保在其上调用finishEncoding,然后XML将在您在初始时传入的NSMutableData中。

如果您需要从中获取NSString,可以从NSMutableData中获取,如下所示:

NSString* xmlString = [[NSString alloc] initWithData: myMutableData  encoding: NSUTF8StringEncoding];

这应该可以解决问题。祝你好运!

答案 1 :(得分:0)

是的,确实如此。但是,它不是很方便,因为您必须先对对象进行编码,然后将NSData对象保存到要保存到plist中的数组/字典中。

答案 2 :(得分:0)

当你给它一个filename.plist文件路径时,NSKeyedArchiver会自动将对象保存到plist。

答案 3 :(得分:0)

这似乎是iOS中的一个缺陷。我想知道它是否特定于处理用户默认值plist。

作为一种可能的解决方法,也许您可​​以尝试为您的设置管理NSMutableDictionary,并直接将字典读/写为plist文件。

写数据:

NSString* error;
NSData* pListData = [NSPropertyListSerialization dataFromPropertyList:settingsDictionary format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];
[data writeToFile:settingsFilePath atomically:YES];

然后回读数据:

NSString* error;
NSData* pListData = [NSData dataWithContentsOfFile:settingsFilePath];
settingsDictionary = [NSPropertyListSerialization propertyListFromData:pListData mutabilityOption:NSPropertyListImmutable format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];

答案 4 :(得分:0)

试试这个魔法:

NSData* data = [NSKeyedArchiver archivedDataWithRootObject:person];

plist[@"personData"] = data;

要恢复原状,只需使用:

Person* p = [NSKeyedUnarchiver unarchiveObjectWithData:plist[@"personData"]];