Преобразование plist к двоичному файлу plist

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

20
задан iDeveloper 4 April 2016 в 13:13
поделиться

5 ответов

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

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

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

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

17
ответ дан 29 November 2019 в 23:17
поделиться

Не ясно, хотите ли Вы сделать преобразование на iPhone или на сервере. Если это находится на сервере, и можно использовать платформы Какао, эти NSPropertyListSerialization предоставляет услуги для преобразования между поддерживаемыми типами plist (строка, XML и двоичный файл) на OS X (начиная с 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
    }
}

См. страница Property List Pramming Guide на developer.apple.com для получения дополнительной информации.

6
ответ дан 29 November 2019 в 23:17
поделиться

Есть PHP и реализация ruby ​​для этого:

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

14
ответ дан 29 November 2019 в 23:17
поделиться

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

http://gist.github.com/303378

7
ответ дан 29 November 2019 в 23:17
поделиться

Существует также реализация Perl под названием Data :: Plist

2
ответ дан 29 November 2019 в 23:17
поделиться