【问题标题】:Is it possible to serialize custom objects to a plist file in Objective-C?是否可以在 Objective-C 中将自定义对象序列化为 plist 文件?
【发布时间】:2010-12-31 12:35:49
【问题描述】:

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

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

【问题讨论】:

    标签: objective-c serialization plist nscoding


    【解决方案1】:

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

    [myKeyedArchiver setOutputFormat: NSPropertyListXMLFormat_v1_0];
    

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 如果对象应该是 plist 中唯一的对象,则为 this。我认为 OP 想用 NSArray 中的其他对象序列化它。
        【解决方案4】:

        这似乎是 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];
        

        【讨论】:

          【解决方案5】:

          试试这个魔法:

          NSData* data = [NSKeyedArchiver archivedDataWithRootObject:person];
          
          plist[@"personData"] = data;
          

          要取出它,只需使用:

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

          【讨论】:

            猜你喜欢
            • 2023-04-02
            • 1970-01-01
            • 1970-01-01
            • 2011-01-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-13
            相关资源
            最近更新 更多