Преобразование plist в двоичный plist
Apple настоятельно рекомендует использовать формат бинарного plist при чтении больших наборов данных на основе XML в приложениях для iPhone. Среди их аргументов есть тот факт, что синтаксический анализ XML очень обременен iPhone. Однако для этого требуется сначала преобразовать файлы, находящиеся на удаленном веб-сервере.
Для часто меняющегося содержимого это неприемлемо для этого вручную. Если это вообще возможно, я бы хотел, чтобы веб-приложение не вызывало командную строку для выполнения преобразования (т.е. Plutil).
Существуют ли общедоступные алгоритмы для выполнения этого преобразования?
Ответы
Ответ 1
Да. Весь код plist является частью CoreFoundation, которая является open source. CoreFoundation можно напрямую создавать и запускать в Linux и Windows, поэтому вы можете написать CF-инструмент, используя обычные API, которые вы будете использовать в Mac OS X, но создайте и запустите его на других платформах.
Конкретный API, который вы хотите посмотреть, CFPropertyListWriteToStream(). Код для CoreFoundation доступен из Apple (tarball), среди других мест.
Наконец, в зависимости от того, как часто вы обновляете файл, сколько процессора вы должны запасать на сервере, и сколько повторений есть ваши данные, может быть еще одно значительное улучшение, которое вы можете сделать. По умолчанию определенные элементы в бинарных plists уникальны (например, строки). Другие элементы отсутствуют (например, массивы и словари). Бинарный формат plist позволяет им быть уникальным, проблема в том, что дорого ходить и уникальные массивы и словари. Если у вас много идентичных массивов или диктонов в вашем контенте, вы можете увидеть значительное уменьшение размера, удалив их. Вы можете включить это, взломав _flattenPlist() в CFBinaryPlist.c.
Если вы это сделаете, обязательно тщательно протестируйте его и не делайте никаких файлов, которые вы не можете обновлять по сети, на случай, если в будущей версии произойдут какие-либо оптимизации, которые нарушают это. Кроме того, убедитесь, что вы готовы отключить его в момент уведомления.
Ответ 2
Для этого есть реализация PHP и ruby:
http://code.google.com/p/cfpropertylist/
Ответ 3
Связанная реализация Ruby - только Ruby 1.9. Я выбил быстрый двоичный сериализатор, который работает в Ruby 1.8.
http://gist.github.com/303378
Ответ 4
Непонятно, хотите ли вы сделать преобразование на iPhone или на сервере. Если на сервере и вы можете использовать рамки Cocoa, NSPropertyListSerialization
предоставляет услуги для преобразования между поддерживаемыми типами plist (строка, XML и двоичный код) в OS X (начиная с 10.2). Существуют также аналогичные методы в библиотеке Core Foundation, если вы предпочитаете использовать их вместо этого.
Чтобы преобразовать XML-слой в двоичный:
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.
Ответ 5
Существует также реализация Perl
Data::Plist
Ответ 6
Инструмент командной строки plutil - утилита списка свойств
Apple имеет два очень полезных инструмента командной строки для файлов списков свойств mangling.
-
/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
Ответ 7
binary_plist gem, чтобы добавить plist в качестве допустимого формата ответа для контроллеров Rails, выглядит многообещающим.
Ответ 8
Java Spring рамочное решение