Преобразование plist в бинарный plist - PullRequest
20 голосов
/ 05 ноября 2008

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

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

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

Ответы [ 9 ]

17 голосов
/ 05 ноября 2008

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

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

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

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

14 голосов
/ 06 декабря 2009

Для этого есть реализация на PHP и ruby:

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

7 голосов
/ 13 февраля 2010

Связанная реализация Ruby - это только Ruby 1.9. Я запустил быстрый двоичный сериализатор, который работает в Ruby 1.8.

http://gist.github.com/303378

6 голосов
/ 05 ноября 2008

Непонятно, хотите ли вы конвертировать на 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.

4 голосов
/ 05 июня 2015

Plutil инструмента командной строки - утилита списка свойств

У Apple есть два очень хороших инструмента командной строки для искажения файлов списков свойств.

  • /usr/libexec/Plistbuddy - для редактирования списков
  • /usr/bin/plutil - проверка синтаксиса и преобразование типов

со страницы руководства plutil:

plutil можно использовать для проверки синтаксиса файлов списка свойств или преобразования файл plist из одного формата в другой. Указание - как входной файл читает со стандартного ввода.

Преобразование существующего plist в формат XML, Binary или JSON

plutil -convert xml1 stops2.plist
plutil -convert binary1 stops2.plist
plutil -convert json stops2.plist
2 голосов
/ 16 апреля 2010

Существует также реализация Perl Данные :: Plist

0 голосов
/ 25 апреля 2019

Несколько дней назад я обнаружил некоторые проблемы в сети с бинарными данными plist в iOS, и мой Gist должен решить эту проблему просто: Plist Converter, написанный на Swift

0 голосов
/ 15 ноября 2012
0 голосов
/ 12 июня 2011

Gem binary_plist для добавления plist в качестве допустимого формата ответа для контроллеров Rails выглядит многообещающе.

...