转换plist以二进制plist
-
06-07-2019 - |
题
苹果强烈建议采用的二进制plist格式阅读时大基于XML数据集到的iPhone应用程序。在他们的理由是事实,XML分析是非常繁重的。然而,这种要求的文件,居住在远程网络服务器被转换第一次。
对于经常变化的内容,这是不可接受做这个手动。如果可能的话,我想为了避免具有一个基于网络的应用程序的话命令行执行转换(即,plutil).
有没有公开的算法来执行这一转换?
解决方案
是。所有plist代码都是CoreFoundation的一部分,它是开源的。 CoreFoundation可以直接在Linux和Windows上构建和运行,因此您可以使用在Mac OS X上使用的普通API编写CF工具,但可以在其他平台上构建和运行它。
您想要查看的特定API是 CFPropertyListWriteToStream()。 CoreFoundation的代码可从 Apple 获取( tarball )等等。
最后,根据您更新文件的频率,服务器上需要多少处理器,以及您的数据重复次数,可能会有一个重要的增强功能。默认情况下,二进制plist中的某些元素是唯一的(例如字符串)。其他元素不是(例如数组和字典)。二进制plist格式允许它们是唯一的,问题是实际遍历并且独特的数组和字典是昂贵的。如果您的内容中有许多相同的数组或词组,则可以通过单独使用来显着减小大小。你可以通过在 CFBinaryPlist中删除_flattenPlist()来启用它。 ç。
如果你这样做,请确保彻底测试它,并且不要对任何无法通过网络更新的文件进行测试,以防将来的版本进行任何优化以破坏它。此外,请确保您准备好立即关闭它。
其他提示
有一个PHP和ruby实现:
链接的Ruby实现仅适用于Ruby 1.9。我敲了一个快速的二进制序列化程序,它在Ruby 1.8中运行。
目前尚不清楚是否要在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
}
}
命令行工具plutil-财产清单的实用
苹果有两个非常好的命令行工具,用于重整的财产列表的文件。
/usr/libexec/Plistbuddy
-编辑plist/usr/bin/plutil
-语法检查和类型转换
从plutil人页:
plutil可以用来检查的语法性列表的文件,或转换 一plist文件,从一种格式到另一个。指定-作为一个文件输入 读stdin。
转换现有的plist XML、二进制函的格式
plutil -convert xml1 stops2.plist
plutil -convert binary1 stops2.plist
plutil -convert json stops2.plist
还有一个Perl实现 Data :: Plist
binary_plist gem 将plist添加为Rails控制器的有效响应格式看起来很有希望。
几天前我在iOS中发现了与plist二进制数据联网的一些问题,我的 Gist
就是简单地解决问题:用Swift编写的Plist转换器