Список недвижимости - Property list

Список недвижимости
Расширение имени файла
.plist
Тип интернет-СМИ
приложение / x-plist
Единый идентификатор типа (UTI)com.apple.property-list
РазработанКомпьютер Apple и GNUstep,
раньше Следующий
Тип форматаСериализация из толковый словарь объекты.

в macOS, iOS, Следующий шаг, и GNUstep программирование рамки, список недвижимости файлы - это файлы, в которых хранятся сериализованный объекты. Файлы списка свойств используют расширение имени файла .plist, и поэтому их часто называют p-список файлы.

Файлы списка свойств часто используются для хранения настроек пользователя. Они также используются для хранения информации о связки и Приложения, задача обслуживается вилка ресурса в старой Mac OS.

Списки свойств также используются для локализация струны для развития. Эти файлы используют .strings или же .stringsdict расширения. Первый - это "уменьшенный" старый список, содержащий только один словарь без фигурных скобок (см. propertyListFromStringsFileFormat),[1] а последний - полноценный лист. XCode также использует .pbxproj расширение для устаревших списков, используемых в качестве файлов проекта.

Представления

Поскольку данные, представленные списками свойств, несколько Абстрактные, лежащие в основе формат файла может быть реализовано разными способами. А именно, Следующий шаг использовал один формат для представления списка свойств, а последующие GNUstep и macOS фреймворки представили различные форматы.

Следующий шаг

Под Следующий шаг, списки собственности были разработаны, чтобы человек читаемый и отредактирован вручную, сериализован в ASCII в синтаксисе вроде язык программирования. Этот же формат использовался OpenStep.

  • Строки представлены в буквальном стиле C: "Это строка списка n"; более простые строки без кавычек допускаются, если они состоят из буквенно-цифровых символов и одного из _$+/:.-.
  • Двоичные данные представлены как: < [шестнадцатеричные коды в ASCII] >. Пробелы и комментарии между парными шестнадцатеричными кодами игнорируются.
  • Массивы представлены как: ( "1", "2", "3" ). Допускаются завершающие запятые.
  • Словари представлены как: {"ключ" = "значение"; ...}. Левая часть должна быть строкой, но может быть без кавычек.
  • Комментарии разрешены как: / * Это комментарий * / и // Это строчный комментарий.
  • Как и в C, пробелы обычно не имеют значения для синтаксиса. Операторы значений оканчиваются точкой с запятой.

Одним из ограничений исходного формата списка свойств NeXT является то, что он не может представлять объект NSValue (число, логическое значение и т. Д.). В результате эти значения должны быть преобразованы в строку и "нечетко" восстановлены приложением.[2] Еще одно ограничение заключается в том, что не определена официальная 8-битная кодировка.[3]

В значения по умолчанию Утилита, представленная в OpenStep (1998), может использоваться для управления файлами plist, используемыми для хранения настроек (известных как значения по умолчанию в NeXTSTEP, отсюда и название) в командной строке через свой домен настроек, и эту утилиту можно использовать для редактирования произвольных файлов plist. Эта утилита заменила три старые команды.[4]

GNUstep

GNUstep принимает формат NeXTSTEP с дополнениями для представления типов данных NSValue и NSDate. Новые типизированные записи имеют вид <*Т...>, куда Т это однобуквенный код. Например, значение NSValue логического YES представляется как <*BY> и объекты NSDate представлены как <*DYYYY-MM-DD HH:MM:SS +ZZZZ>.[5][6] Двоичные данные также могут использовать более эффективные base64 форматировать как <[ b64... ]>. Неявно решена и 8-битная проблема, поскольку в большинстве развертываний используется UTF-8. В целом, NSPropertyListGNUstepFormat приносит выразительность и компактность удобочитаемого текстового формата наравне с форматом Apple XML.

GNUstep также имеет собственный двоичный формат, NSPropertyListGNUstepBinaryFormat, реализованный в NSSerialization. Этот формат определяется рекурсивно, как и текстовые форматы, с однобайтовым маркером типа, предшествующим некоторым данным. Форма интернирование струн поддерживается через GS-расширение shouldBeCompact выключатель.[7]

В GNUstep есть два относительно независимых обработчика списков: CFPropertyList в libs-core-base (CoreFoundation) и NSPropertyList в libs-base (Foundation Kit). Оба в некоторой степени поддерживают двоичные и XML-формы, используемые в macOS, но последняя намного более полная. Например, два специфичных для GNUstep формата обрабатываются только в последнем.[8]

GNUstep предоставляет набор инструментов командной строки plist на основе NSPropertyList, включая версию pl[9] и значения по умолчанию.[4]

macOS

Хотя macOS также может читать формат NeXTSTEP, Apple отказывается от него в пользу двух собственных новых форматов: одного на основе XML, а другого - двоичного. У Apple также есть частично совместимый формат JSON (NSJSONSerialization).

История

В Mac OS X 10.0, формат NeXTSTEP был устарел, и новый XML был введен формат с публичным DTD определяется яблоко. Формат XML поддерживает символы, отличные от ASCII, и сохраняет объекты NSValue (которые, в отличие от формата списка свойств ASCII в GNUstep, формат списка свойств Apple ASCII не поддерживает).[10]

Однако поскольку файлы XML не являются наиболее экономичным средством хранения, Mac OS X 10.2 представил новый формат, в котором файлы списка свойств хранятся как двоичные файлы. Начиная с Mac OS X 10.4, это формат по умолчанию для файлов настроек. В Mac OS X 10.7, поддержка чтения и записи файлов в JSON формат был введен. Однако JSON и списки свойств не полностью совместимы друг с другом. Например, списки свойств имеют собственные даты и типы данных, которые формат JSON не поддерживает. И наоборот, JSON разрешает ноль значения, в то время как списки свойств не поддерживают явные значения NULL.

Инструменты

Старый значения по умолчанию инструмент от NeXTSTEP остается доступным. В / usr / libexec / PlistBuddy Команда предоставляет интерактивный редактор списков. Это также может быть написано по сценарию.[11]

В плутил утилита (введена в Mac OS X 10.2 ) можно использовать для проверки синтаксиса списков свойств или преобразования файла списка свойств из одного формата в другой. Он также поддерживает преобразование списков в объектные литералы Objective-C или Swift.[12] Как какао NSPropertyListSerialization он построен на основе ввода "старого стиля", но не преобразуется в этот тип. (Какао NSSerializer до того, как Mac OS X 10.2 выдает вывод в старом стиле.)

В pl Утилита представлена ​​в Mac OS X v10.5. Он принимает любые входные данные и пытается сгенерировать списки в "старом стиле".[13][а] Как и версия GNUstep, похоже, что он использует описание свойство типов Foundation, найденных в списках, которые Apple указала для создания действительных списков старого стиля.[b]

Что касается внутреннего устройства, Apple предоставляет анализатор с открытым исходным кодом для старого стиля, XML и двоичных форматов в своих C Основной фундамент код как CFPropertyList. Однако все утилиты и большинство частей системы используют парсер NSPropertyList с закрытым исходным кодом из Obj-C Foundation Kit. Повторная реализация Swift имеет открытый исходный код, но ее идентичность не гарантируется.

Формат

XML и JSON списки свойств редактируются вручную в любом текстовом редакторе. Кроме того, Apple оказывает поддержку в Xcode для редактирования списков свойств в иерархическом средстве просмотра / редакторе, который может обрабатывать списки, отформатированные в двоичном или XML, но нет JSON. По состоянию на Mac OS X 10.4, Apple предоставляет AppleScript интерфейс для чтения файлов списка свойств через приложение «Системные события». По состоянию на Mac OS X 10.5, Apple предоставляет AppleScript интерфейс для редактирования, создания и записи файлов списка свойств.[14]

Для формата XML используются следующие теги, связанные классы Foundation и типы CoreFoundation, а также форматы хранения данных:

Базовый классТип CoreFoundationТег XMLФормат хранения
NSStringCFString<string>Строка в кодировке UTF-8
NSNumberCFNumber<real>, <integer>Десятичная строка; вещественные числа могут иметь степень, бесконечность (бесконечность) или NaN (нан).
NSNumberCFBoolean<true/>, <false/>Нет данных (только тег)
NSDateCFDate<date>ISO 8601 форматированная строка
NSDataCFData<data>Base64 закодированные данные
NSArrayCFArray<array>Может содержать любое количество дочерних элементов. Может быть пустым.
NSDictionaryCFDictionary<dict>Чередование <key> теги и теги элементов plist. Может быть пустым.

В Двоичный файл формат задокументирован в блоке комментариев в Основной фундамент Исходный файл кода C (CF / CFBinaryPList.c) для реализации бинарных списков с открытым кодом от Apple в своей библиотеке Foundation.[15] Apple описывает эту реализацию как непрозрачную в документации на странице руководства plist (5),[16] Это означает, что нельзя полагаться на формат. В двоичном формате файла магическое число (первые несколько байтов файла, которые указывают, что это действительный файл plist) - это текст bplist, за которым следуют два байта, указывающие версию формата.

В двоичном файле может храниться некоторая информация, которая не может быть записана в форматах файлов XML или JSON. Двоичные типы массивов, наборов и словарей состоят из указатели - записи objref и keyref - этот индекс в таблице объектов в файле. Это означает, что двоичные списки могут фиксировать тот факт, что, например, отдельный массив и словарь, сериализованные в файл, имеют один и тот же элемент данных, хранящийся в них. Это не может быть записано в файл XML. Преобразование такого двоичного файла приведет к тому, что копия элемента данных будет помещена в файл XML. Кроме того, двоичный файл имеет тип UID, который используется для идентификации элементов данных при сериализации. Полный список данных, которые могут быть сохранены, взят из исходного файла кода C, выглядит следующим образом:

Форматы двоичных объектов plist (начиная с CoreFoundation 1153)[15]
Базовый классТип CoreFoundationТип объектаБайт маркераЗакодированные данные
нольнольноль (v "1?" +)0000 0000н / д
NSNumberCFBooleanbool0000 1000 (ложь)
0000 1001 (верно)
н / д
NSURLCFURLurl (v "1?" +)0000 1100 (базовая строка)
0000 1001 (строка)
строка: строка URL в рекурсивной кодировке (как в «формате строкового объекта?»); базовая строка: то же самое, но с первым закодированным базовым URL.
NSUUIDCFUUIDuuid (v "1?" +)0000 111016 байт UUID
наполнять0000 1111ничего - просто набивка
NSNumberCFNumberint0001 ннннКоличество байтов - 2 ^ nnnn, байты с прямым порядком байтов (1, 2, 4 или 8)
NSNumberCFNumberнастоящий0010 нннн# байтов - 2 ^ nnnn, байты с прямым порядком байтов (4 или 8)
NSDateCFDateДата0011 0011Далее следует 8 байтов с плавающей точкой, байты с прямым порядком байтов; секунд с 01.01.2001 (Основные данные эпоха)
NSDataCFDataданные0100 нннн [число]nnnn - количество байтов, если не 1111, затем следует int count, за которым следуют байты
NSStringCFStringнить0101 nnnn [число]Строка ASCII, nnnn - это количество символов, иначе 1111, затем int count, затем байты
NSStringCFStringнить0110 нннн [число]Строка Unicode, nnnn - это количество символов, иначе 1111, затем число int, затем 2-байтовый uint16_t с прямым порядком байтов
NSStringCFStringнить (v "1?" +)0111 nnnn [число]Строка UTF-8, nnnn - это количество символов, иначе 1111, затем int count, затем байты
NSNumberCFNumberUID1000 ннннnnnn + 1 - # байтов с прямым порядком байтов (1, 2, 4 или 8). Беззнаковое int, создается только NSKeyedArchiver (Смотри ниже).[17]
NSArrayCFArrayмножество1010 нннн [число]objref * nnnn - это count, если не '1111', затем следует int count
NSOrderedSetordset (v "1?" +)1011 nnnn [число]objref * nnnn - это count, если не '1111', затем следует int count
NSSetCFSetнабор (v "1?" +)1100 нннн [число]objref * nnnn - это count, если не '1111', затем следует int count
NSDictionaryCFDictionaryдиктовать1101 нннн [число]keyref * objref * nnnn является count, если не '1111', затем следует int count

Обратите внимание v "1?" + обратите внимание на многие типы. Это означает, что байт маркера встречается только в файлах с версией формата не ниже "1?" магическое число. Точный способ их анализа более туманный, чем способ анализа устаревших типов, поскольку реализация CFBinaryPlist обрабатывает только версию «0?». На практике эти типы никогда не встречаются, поскольку NSKeyedArchiver уже способен захватывать эту информацию.

За таблицей объектов следует таблица смещений, за которой следует трейлер, содержащий информацию о размере и расположении двух таблиц.

Сериализация в plist

Поскольку списки свойств не охватывают всю информацию и типы данных, необходимые для описания произвольного объекта, часто выполняется дополнительный уровень кодирования и декодирования. Спецификация OpenStep абстрагирует операцию сериализации любого NSObject под NSCoding протокол. Экземпляры любого класса, реализующего этот протокол, могут быть сериализованы NSCoder подкласс другого формата.[18] Существуют два основных кодировщика с целью сериализации объектов в списки:

  • NSArchiver, который преобразует объект в блок двоичных данных, что-то вроде структуры с тегами. Этот класс является частью OpenStep, хотя конкретный формат не определен. На практике его можно использовать для сериализации объекта в файл (пропуская список файлов) или для встраивания данных в список файлов. Его необходимо читать и писать в том же порядке, в котором написано. Вступление к NSKeyedArchiver осуждает его использование.
  • NSKeyedArchiver, представленная в Mac OS X 10.2, преобразует объект в NSDictionary. Основное улучшение этого формата для программистов заключается в том, что он обращается к членам не в фиксированном порядке, а по строковым ключам. Внутри он в некоторой степени повторяет формат двоичного списка, сохраняя массив таблицы объектов с именем $ объекты в словаре. На все остальное, включая информацию о классе, ссылается указатель UID. А $ топ запись под dict указывает на объект верхнего уровня, который программист намеревался кодировать.[17]

Среди прочего, использование архиватора позволяет кодировать новые типы данных без изменения самого формата plist, и для Apple это предпочтительный способ кодирования таких вещей, как NSSets и нулевые значения. Разбор форматов оказывается немного сложнее, поскольку необходимо выполнить еще один уровень даже для некоторых классов, которые должны были поддерживаться списками. Подобно двоичному формату, в котором также есть таблица объектов, можно создавать циклические ссылки в NSKeyedArchiver. Поскольку в XML нет типа данных UID, целые числа хранятся в словаре под ключом «CF $ UID».[19]

Apple издает открытый исходный код NSKeyedArchiver в Swift Corelibs Foundation; как и Apple Foundation с закрытым исходным кодом, он ограничивает выходные форматы только двоичными и XML. В нем также есть несколько тестовых примеров, показывающих результаты сериализации.[20] GNUstep также имеет совместимую реализацию, которая не ограничивает форматы вывода.[21]

Язык пути

Не существует единого стандартизированного языка путей для списков свойств, таких как XPath подходит для XML, но существуют неформальные соглашения, используемые различными программами.

  • Версия точечного синтаксиса находится в keypath аргумент Apple плутил. Похоже, происходит из (id) - [NSObject (NSKeyValueCoding) valueForKeyPath:].[12]
  • Другой формат используется PlistBuddy, с синтаксисом двоеточия для индексации.[11]

Ни один из форматов не может выразить ключ с символом-разделителем в нем.

Другие платформы

Windows

Хотя файлы plist наиболее известны в системах Apple или Darwin, включая iOS и macOS, они также присутствуют на компьютерах Windows, когда программное обеспечение Apple, такое как iTunes[22] или Safari[23] установлены. В Windows файлы обычно представляют собой двоичные файлы,[24] хотя некоторые приложения могут создавать файлы PLIST в других форматах.

В Windows файлы Apple plist хранятся в домашнем каталоге пользователя в % USERPROFILE% AppData Roaming Apple Computer. Эти файлы plist в Windows обычно хранят настройки и другую информацию, а не используют реестр Windows.

Опции для редактирования файлов PLIST в Windows не так обширны, как в macOS. Если файл находится в формате XML или JSON, осторожно используйте текстовый редактор, например Блокнот ++ может быть использован. Apple поставляет plutil.exe в своем пакете «Поддержка приложений Apple» (который является частью iTunes ), и он идентичен своему аналогу в macOS.

NetBSD

Представлен в 2006 году и впервые выпущен с NetBSD № 4.0 (2007) - это библиотека proplib, которую можно использовать для сериализации данных между ядром и пользовательской средой. Он реализует часть языка списков XML.[25]

Один из примеров пользователей proplib - вторая версия sysmon envsys рамки для системный мониторинг.

Библиотека proplib NetBSD также была перенесена на DragonFly в 2010 году и доступна с DragonFly BSD # 2.8.[26]

Кроссплатформенность

  • Facebook повторная реализация с открытым исходным кодом Xcode инструмент сборки xcbuild содержит библиотеку plist, а также плутил и PlistBuddy. Эти кроссплатформенные утилиты написаны на C ++.[27]
  • В Язык программирования Python имеет встроенный plistlib модуль для чтения и записи файлов plist в формате Apple XML или в двоичном формате (начиная с Python 3.4).[28] ProperTree - это кроссплатформенный редактор, использующий эту библиотеку.[29]
    • Сторонняя библиотека ccl-bplist имеет дополнительную возможность обрабатывать UID NSKeyedArchiver.[19]
  • Идти имеет список пакет, который поддерживает четыре типа списков: текст OpenStep, текст GNUStep, Apple XML и Apple Binary. Он также обрабатывает UID в XML и двоичных форматах.[2]

Смотрите также

Примечания

  1. ^ Причуда macOS pl заключается в том, что он помещает случайный символ "D" в стандартный вывод, если кто-то вручную набрал стандартный ввод и завершил его с помощью ^ D.
  2. ^ В описание в Obj-C Foundation NSData содержит ошибку в том, что возвращает словарное представление. У Swift Foundation с открытым исходным кодом такой проблемы нет.

Рекомендации

  1. ^ "Ссылка на класс NSString: propertyListFromStringsFileFormat". GNUstep. Получено 17 февраля, 2020.
  2. ^ а б «Пакетный лист». godoc.org. Когда Unmarshal встречает список свойств OpenStep, он переходит в расслабленный режим синтаксического анализа: списки свойств OpenStep могут хранить только простые старые данные в виде строк, поэтому мы попытаемся восстановить целые числа, значения с плавающей запятой, логические значения и значения даты везде, где они необходимы.
  3. ^ «Списки свойств ASCII в старом стиле». Разработчик Apple (Руководство по программированию списка свойств). Получено 16 февраля, 2020.
  4. ^ а б по умолчанию (1) – Linux Общие команды Руководство
  5. ^ Фрит-Макдональд, Ричард (2004). "Документация класса NSPropertyListSerialization". GNUstep.
  6. ^ «Списки собственности». GNUstepWiki.
  7. ^ «Документация по NSSerialization». GNUstep. исходный код
  8. ^ «Типы и константы: NSPropertyListFormat». gnustep.org.
  9. ^ плды (1) – Linux Общие команды Руководство
  10. ^ "appleexaminer.com:" файлы PLIST"". Архивировано из оригинал 19 февраля 2014 г.. Получено 27 февраля, 2014.
  11. ^ а б PlistBuddy (8) – Дарвин и macOS Системный менеджер Руководство
  12. ^ а б плутил (1) – Дарвин и macOS Общие команды Руководство
  13. ^ пл (1) – Дарвин и macOS Общие команды Руководство
  14. ^ «AppleScript: списки свойств». 24 апреля 2009 г. Архивировано с оригинал 24 апреля 2009 г.
  15. ^ а б "CF / CFBinaryPList.c". Открытый исходный код Apple. Получено 6 января, 2020.
  16. ^ лист (5) – Дарвин и macOS Форматы файлов Руководство
  17. ^ а б Кейтнесс, Алекс (4 апреля 2012 г.). "Сообщение компьютерщика: файлы NSKeyedArchiver - что это такое и как я могу их использовать?". Цифровое расследование. Тип данных CF $ UID в листинге 2 представляет собой словарь с одним ключом («CF $ UID»), за которым следует целое число (этот макет - это то, что вы увидите, когда список свойств представлен в XML; в исходном двоичный формат (тип данных «UID» - это отдельная сущность, не требующая структуры словаря). Эти типы данных представляют собой ссылку на другую сущность в массиве «$ objects». Номер CF $ UID дает позицию массива.
  18. ^ "NSCoder.html". Спецификация OpenStep.
  19. ^ а б CCLForensics Group (15 января 2020 г.). "cclgroupltd / ccl-bplist". GitHub.
  20. ^ "apple / swift-corelibs-foundation: NSKeyedArchiver.swift". GitHub. тесты
  21. ^ "Документация NSKeyedArchiver". Документация GNUstep. Получено 23 февраля, 2020. исходный код
  22. ^ «Резервное копирование iTunes - iPhone Wiki». www.theiphonewiki.com.
  23. ^ «Как веб-браузер Apple Safari сохраняет свои настройки в Windows?». Суперпользователь.
  24. ^ "GitHub - microsoft / NSPlist: NSPlist". 3 мая 2019 г. - через GitHub.
  25. ^ Джейсон Р. Торп. "proplib - библиотека объектов контейнера свойств". NetBSD. Сложить резюме.
  26. ^ Джейсон Р. Торп. "proplib - библиотека объектов контейнера свойств". DragonFly BSD. Сложить резюме.
  27. ^ "facebook / xcbuild / Libraries / plist". GitHub. Получено 17 февраля, 2020.
  28. ^ "plistlib - Создание и анализ файлов .plist Mac OS X". Документация Python 3. Получено 6 января, 2020.
  29. ^ "corpnewt / ProperTree: кроссплатформенный редактор списков GUI, написанный на python". GitHub. 17 февраля 2020 г.. Получено 17 февраля, 2020.

внешняя ссылка