4

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

@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 转储到变量而不是文件中?

4

5 回答 5

2

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

[myKeyedArchiver setOutputFormat: NSPropertyListXMLFormat_v1_0];

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

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

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

这应该够了吧。祝你好运!

于 2010-12-31T14:47:33.313 回答
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];
于 2011-05-27T18:12:50.243 回答
0

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

于 2010-12-31T12:48:27.600 回答
0

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

于 2010-12-31T12:44:20.143 回答
0

试试这个魔法:

NSData* data = [NSKeyedArchiver archivedDataWithRootObject:person];

plist[@"personData"] = data;

要取出它,只需使用:

Person* p = [NSKeyedUnarchiver unarchiveObjectWithData:plist[@"personData"]];
于 2016-01-25T20:20:06.950 回答