将plist转换为二进制plist

时间:2008-11-05 06:00:45

标签: objective-c iphone cocoa-touch plist core-foundation

Apple强烈建议在将大型基于XML的数据集读入iPhone应用程序时使用二进制plist格式。他们的理由是,XML解析对iPhone非常重要。但是,这要求首先转换驻留在远程Web服务器上的文件。

对于频繁更改的内容,手动执行此操作是不可接受的。如果可能的话,我想避免让基于Web的应用程序调用命令行来执行转换(即plutil)。

是否有公开的算法来执行此转换?

9 个答案:

答案 0 :(得分:17)

是。所有plist代码都是CoreFoundation的一部分,它是开源的。 CoreFoundation可以直接在Linux和Windows上构建和运行,因此您可以使用在Mac OS X上使用的普通API编写CF工具,但可以在其他平台上构建和运行它。

您要查看的特定API是CFPropertyListWriteToStream()。 CoreFoundation的代码可以从Appletarball)以及其他地方获得。

最后,根据您更新文件的频率,服务器上需要多少处理器,以及您的数据重复次数,可能会有一个重要的增强功能。默认情况下,二进制plist中的某些元素是唯一的(例如字符串)。其他元素不是(例如数组和字典)。二进制plist格式允许它们是唯一的,问题是实际遍历并且独特的数组和字典是昂贵的。如果您的内容中有许多相同的数组或词组,则可以通过单独使用来显着减小大小。您可以通过在CFBinaryPlist.c中删除_flattenPlist()来启用它。

如果你这样做,请确保非常彻底地测试它,并且不要对任何无法通过网络更新的文件进行测试,以防将来的版本进行任何优化以破坏它。此外,请确保您准备好立即关闭它。

答案 1 :(得分:14)

有一个PHP和ruby实现:

http://code.google.com/p/cfpropertylist/

答案 2 :(得分:7)

链接的Ruby实现仅适用于Ruby 1.9。我敲了一个快速的二进制序列化程序,它在Ruby 1.8中运行。

http://gist.github.com/303378

答案 3 :(得分:6)

目前尚不清楚是否要在iPhone或服务器上进行转换。如果它在服务器上并且您可以使用Cocoa框架,则NSPropertyListSerialization提供服务以在OS X上支持的plist类型(字符串,XML和二进制)之间进行转换(自10.2起)。如果你更愿意使用它,那么Core Foundation库中也有类似的方法。

要将XML plist转换为二进制文件:

NSString *xmlPlistPath; // already set
NSString *outPath; // already set


NSData *plistData;
NSString *error;
NSPropertyListFormat format;
id plist;
plistData = [NSData dataWithContentsOfFile:xmlPlistPath];

plist = [NSPropertyListSerialization propertyListFromData:plistData
                                         mutabilityOption:NSPropertyListImmutable
                                                   format:&format
                                         errorDescription:&error];

if(plist == nil) { // unable to parse plist
    //deal with failure -- error gives description of the error
} else {
    binaryPlistData = [NSPropertyListSerialization dataFromPropertyList:plist
                                                                 format:NSPropertyListBinaryFormat_v1_0
                                                       errorDescription:&error];
    if(binaryPlistData == nil) {//unable to create serialized plist
         // deal with failure -- error gives description of the error
    }

    if(![binaryPlistData writeToFile:outPath atomically:YES]) {
        // unable to write file
    }
}

有关详细信息,请参阅developer.apple.com上的Property List Pramming Guide页面。

答案 4 :(得分:4)

命令行工具plutil - 属性列表实用程序

Apple有两个非常好的命令行工具可用于修改属性列表文件。

  • /usr/libexec/Plistbuddy - 用于编辑帖子
  • /usr/bin/plutil - 语法检查和类型转换

来自plutil手册页:

  

plutil可用于检查属性列表文件的语法,或转换        从一种格式到另一种格式的plist文件。指定 - 作为输入文件        从stdin读取。

将现有plist转换为XML,Binary或JSON格式

plutil -convert xml1 stops2.plist
plutil -convert binary1 stops2.plist
plutil -convert json stops2.plist

答案 5 :(得分:2)

还有一个Perl实现 Data::Plist

答案 6 :(得分:0)

将plist添加为Rails控制器的有效响应格式的binary_plist gem看起来很有希望。

答案 7 :(得分:0)

答案 8 :(得分:0)

几天前,我在服务器上发现了一些与plist二进制数据联网的问题,而我的Gist就是要简单地解决问题:Plist Converter written in Swift