Подтвердить что ты не робот

Преобразование plist в двоичный plist

Apple настоятельно рекомендует использовать формат бинарного plist при чтении больших наборов данных на основе XML в приложениях для iPhone. Среди их аргументов есть тот факт, что синтаксический анализ XML очень обременен iPhone. Однако для этого требуется сначала преобразовать файлы, находящиеся на удаленном веб-сервере.

Для часто меняющегося содержимого это неприемлемо для этого вручную. Если это вообще возможно, я бы хотел, чтобы веб-приложение не вызывало командную строку для выполнения преобразования (т.е. Plutil).

Существуют ли общедоступные алгоритмы для выполнения этого преобразования?

4b9b3361

Ответ 1

Да. Весь код plist является частью CoreFoundation, которая является open source. CoreFoundation можно напрямую создавать и запускать в Linux и Windows, поэтому вы можете написать CF-инструмент, используя обычные API, которые вы будете использовать в Mac OS X, но создайте и запустите его на других платформах.

Конкретный API, который вы хотите посмотреть, CFPropertyListWriteToStream(). Код для CoreFoundation доступен из Apple (tarball), среди других мест.

Наконец, в зависимости от того, как часто вы обновляете файл, сколько процессора вы должны запасать на сервере, и сколько повторений есть ваши данные, может быть еще одно значительное улучшение, которое вы можете сделать. По умолчанию определенные элементы в бинарных plists уникальны (например, строки). Другие элементы отсутствуют (например, массивы и словари). Бинарный формат plist позволяет им быть уникальным, проблема в том, что дорого ходить и уникальные массивы и словари. Если у вас много идентичных массивов или диктонов в вашем контенте, вы можете увидеть значительное уменьшение размера, удалив их. Вы можете включить это, взломав _flattenPlist() в CFBinaryPlist.c.

Если вы это сделаете, обязательно тщательно протестируйте его и не делайте никаких файлов, которые вы не можете обновлять по сети, на случай, если в будущей версии произойдут какие-либо оптимизации, которые нарушают это. Кроме того, убедитесь, что вы готовы отключить его в момент уведомления.

Ответ 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, выглядит многообещающим.