【问题标题】:Object serialization in XML format using Obj-C / iPhone SDK使用 Obj-C / iPhone SDK 以 XML 格式进行对象序列化
【发布时间】:2011-03-18 13:36:58
【问题描述】:

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

NSPropertyListSerialization documentation 这么说

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

假设我想保存几个 Person 对象(一个家庭),它们的属性都是 property-list 类型。我设法以 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 对象)。

提前致谢, 爱德华多

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    那么 plist 不是你想要的。

    【讨论】:

    • 布赖恩。我已阅读有关档案和序列化的信息。要点是,正如您所说,该对象将作为 (NSData) 保存在 .plist 文件中。我可以使用字典创建实用方法来表示/初始化人员类,但这与“子类化”或使用我在帖子中提到的方法没有什么不同。我希望借助 API(通过使用 NSCoder 子类或 PListSerialization)以 XML 格式“编码”/“解码”Objective-C 对象。也许我将不得不使用 XML 解析器并自己处理它,而不需要 plist 语法,这样更好)。
    • 我决定不再使用 .plist 而是使用 XML 文件 + 一些 DOM 解析器。 raywenderlich.com/725/… 有一个很好的教程。我意识到 plist 语法并不是最适合我的需要,但我期待 iPhone SDK 能够帮助我以一种直接的方式对我的 Objective-C 对象(在 XML 模式下)进行序列化,但事实并非如此。
    【解决方案2】:

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

    【讨论】:

    • 所以,你自己做。将对象表示为 XML 实体并在解码后(可能使用 XML 解析器/DOM)。我期待通过使用 NSCoders 或 PropertyListSerialization 将我的 Objective-C 对象序列化为 .plist。我不明白为什么 API 不够灵活,无法让我的自定义对象以 XML 格式序列化,如果它们只有“属性列表”之类的属性。
    猜你喜欢
    • 2017-10-30
    • 2020-02-15
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多