为简单起见,我们假设我们有以下简单的类接口:
@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转储到变量而不是文件?
答案 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"]];