无法打开 Objective C 中使用 CFPropertyList 在 PHP 中生成的 plist 文件
Cannot open a plist file in Objective C that was generated in PHP using CFPropertyList
我有一个包含序列化 plist 的二进制文件。该文件是在 PHP 中通过以下语句生成的:
namespace CFPropertyList;
require_once(__DIR__.'/../classes/CFPropertyList/CFPropertyList.php');
$a = array ('a' => 'apple', 'b' => 'banana', 'c' => array ('x', 'y', 'z'));
$plist_filename = __DIR__ . '/simple_array.plist';
$plist = new CFPropertyList();
$td = new \CFPropertyList\CFTypeDetector();
$guessedStructure = $td->toCFType($a);
$plist->add($guessedStructure);
$plist->saveBinary($plist_filename);
simple_array.plist 文件的二进制内容是:
6270 6c69 7374 3030 d301 0203 0405 0651 6151 6251 6355 6170 706c 6556
6261 6e61 6e61 a307 0809 5178 5179 517a 080f 1113 151b 2226 282a 0000
0000 0000 0101 0000 0000 0000 000a 0000 0000 0000 0000 0000 0000 0000
002c
我可以在 Xcode 中打开 simple_array.plist(通过双击它)没有问题。
我也可以稍后在 PHP 中使用以下语句重新打开它也没有问题:
$plist = new CFPropertyList( $plist_filename, CFPropertyList::FORMAT_BINARY );
问题出在我尝试打开 Objective C 中的文件时。这些是我正在使用的语句:
NSData *tempData = [NSData dataWithContentsOfFile:path_to_plist_file];
NSArray *fileInfoArray = [NSKeyedUnarchiver unarchiveObjectWithData:tempData];
fileInfoArray
是 nil
!
最后两个语句打开在 Objective C 中生成的其他 plist 文件,但不打开 PHP(在 Linux 上)生成的文件。
知道这里发生了什么吗?此网页 http://nshipster.com/nscoding/ 讨论了 NSCoding 对于 NSKeyed Archiver 的重要性...这是否相关?如果是,我如何在 PHP 中申请?
您可以将 plist 读入字典:
NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfURL:fileURL];
或者您可以使用 NSPropertyListSerialization
:
NSPropertyListFormat format;
NSError *error;
NSDictionary *dictionary = [NSPropertyListSerialization propertyListWithData:data options:0 format:&format error:&error];
根据你的数据,这两个对我都有效。
有关详细信息,请参阅 Property List Programming Guide。
我有一个包含序列化 plist 的二进制文件。该文件是在 PHP 中通过以下语句生成的:
namespace CFPropertyList;
require_once(__DIR__.'/../classes/CFPropertyList/CFPropertyList.php');
$a = array ('a' => 'apple', 'b' => 'banana', 'c' => array ('x', 'y', 'z'));
$plist_filename = __DIR__ . '/simple_array.plist';
$plist = new CFPropertyList();
$td = new \CFPropertyList\CFTypeDetector();
$guessedStructure = $td->toCFType($a);
$plist->add($guessedStructure);
$plist->saveBinary($plist_filename);
simple_array.plist 文件的二进制内容是:
6270 6c69 7374 3030 d301 0203 0405 0651 6151 6251 6355 6170 706c 6556 6261 6e61 6e61 a307 0809 5178 5179 517a 080f 1113 151b 2226 282a 0000 0000 0000 0101 0000 0000 0000 000a 0000 0000 0000 0000 0000 0000 0000 002c
我可以在 Xcode 中打开 simple_array.plist(通过双击它)没有问题。
我也可以稍后在 PHP 中使用以下语句重新打开它也没有问题:
$plist = new CFPropertyList( $plist_filename, CFPropertyList::FORMAT_BINARY );
问题出在我尝试打开 Objective C 中的文件时。这些是我正在使用的语句:
NSData *tempData = [NSData dataWithContentsOfFile:path_to_plist_file];
NSArray *fileInfoArray = [NSKeyedUnarchiver unarchiveObjectWithData:tempData];
fileInfoArray
是 nil
!
最后两个语句打开在 Objective C 中生成的其他 plist 文件,但不打开 PHP(在 Linux 上)生成的文件。
知道这里发生了什么吗?此网页 http://nshipster.com/nscoding/ 讨论了 NSCoding 对于 NSKeyed Archiver 的重要性...这是否相关?如果是,我如何在 PHP 中申请?
您可以将 plist 读入字典:
NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfURL:fileURL];
或者您可以使用 NSPropertyListSerialization
:
NSPropertyListFormat format;
NSError *error;
NSDictionary *dictionary = [NSPropertyListSerialization propertyListWithData:data options:0 format:&format error:&error];
根据你的数据,这两个对我都有效。
有关详细信息,请参阅 Property List Programming Guide。