Введение

Формат файла

В программных фреймворках macOS, iOS, NeXTSTEP и GNUstep файлы списков свойств — это файлы, хранящие сериализованные объекты. Файлы списков свойств используют расширение имени файла plist и поэтому часто называются p-list файлами. Файлы списков свойств часто используются для хранения настроек пользователя. Они также используются для хранения информации о пакетах и приложениях, задачу, которую в старой Mac OS выполняла вилка ресурсов. Списки свойств также используются для хранения строк локализации при разработке. Эти файлы используют расширения strings или stringsdict. Первое представляет собой "упрощенный" plist старого стиля, содержащий только один словарь без фигурных скобок (см.), а второе — полноценный plist. Xcode также использует расширение pbxproj для plist старого стиля, используемых в качестве файлов проекта.

Представительства

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

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

В NeXTSTEP списки свойств были разработаны для удобства чтения и ручного редактирования, с сериализацией в ASCII в синтаксисе, напоминающем язык программирования. Тот же формат использовался и в OPENSTEP. Строки представлены в стиле C-литералов: более простые строки без кавычек допустимы, если они состоят из буквенно-цифровых символов и одного из. Бинарные данные представлены как: < [шестнадцатеричные коды в ASCII] >. Пробелы и комментарии между парными шестнадцатеричными кодами игнорируются. Массивы представлены как: Допускаются завершающие запятые. Словари представлены следующим образом: Левая часть должна быть строкой, но она может быть без кавычек. Комментарии допускаются как: и. Как и в C, пробелы обычно не имеют значения для синтаксиса. Операторы заканчиваются точкой с запятой. Ограничением оригинального формата списков свойств NeXT было то, что он не мог представить объект NSValue (число, логическое значение и т.д.). В результате эти значения приходилось преобразовывать в строки и "приблизительно" восстанавливать в приложении. Утилита defaults, представленная в OPENSTEP (1996), позволяет манипулировать plist-файлами, используемыми для хранения предпочтений (известных как defaults в NeXTSTEP, отсюда и название) из командной строки через их домен предпочтений, и может использоваться для редактирования произвольных plist-файлов. Эта утилита заменила три старые команды (dread, dwrite и dremove). Бинарные данные также могут использовать более эффективный формат base64, поскольку 8-битная проблема решается неявно, так как большинство установок используют UTF-8. В целом, это обеспечивает выразительность и компактность удобочитаемого текстового формата на уровне формата XML от Apple. GNUstep также имеет свой собственный двоичный формат, , реализованный в . Этот формат определяется рекурсивно, как и текстовые форматы, с однобайтовым маркером типа, предшествующим данным. Поддерживается интернирование строк через GS-расширение . В GNUstep существует два относительно независимых обработчика plist: в (CoreFoundation) и в (Foundation Kit). Оба поддерживают двоичные и XML-формы, используемые macOS, в определенной степени, но последний гораздо более полный. Например, два формата, специфичных для GNUstep, обрабатываются только в последнем. GNUstep предоставляет набор инструментов командной строки plist, основанных на , включая версию и .

macOS

В то время как macOS также может читать формат NeXTSTEP, Apple предпочитает использовать два новых формата собственной разработки – один на основе XML, а другой – бинарный. Apple также располагает частично совместимым форматом JSON.

История

В Mac OS X 10.0 формат NeXTSTEP был устаревшим, и был представлен новый XML-формат с общедоступным DTD, определённым Apple. XML-формат поддерживает символы, отличные от ASCII, и хранение объектов NSValue (которые, в отличие от формата списков свойств ASCII в GNUstep, не поддерживаются в формате списков свойств ASCII от Apple). Однако, поскольку XML-файлы не являются наиболее эффективным способом хранения с точки зрения занимаемого места, в Mac OS X 10.2 был представлен новый формат, в котором файлы списков свойств хранятся как бинарные файлы. Начиная с Mac OS X 10.4, этот формат является форматом по умолчанию для файлов настроек. В Mac OS X 10.7 была добавлена поддержка чтения и записи файлов в формате JSON. При этом JSON и списки свойств не полностью совместимы друг с другом. Например, списки свойств имеют собственные типы данных для дат и данных, которые не поддерживаются форматом JSON. В свою очередь, JSON допускает значения null, в то время как списки свойств не поддерживают явные null-значения.

Инструментальная работа

Старый инструмент из NeXTSTEP остаётся доступным. Эта команда предоставляет интерактивный редактор plist-файлов. Её также можно использовать в скриптах. Утилита (представлена в Mac OS X 10.2) может использоваться для проверки синтаксиса списков свойств или для преобразования plist-файла из одного формата в другой. Она также поддерживает преобразование plist-файлов в объектные литералы Objective-C или Swift. Как и Cocoa, на которой она основана, она принимает данные в формате "старого стиля", но не преобразует их в этот формат. (Cocoa до Mac OS X 10.2 выдаёт данные в формате "старого стиля".) Утилита была представлена в Mac OS X v10.5. Она принимает любые входные данные и пытается сгенерировать plist-файлы в формате "старого стиля". Как и версия GNUstep, она, по-видимому, использует свойства типов Foundation, содержащихся в plist-файлах, которые Apple определила для создания корректных plist-файлов "старого стиля". Что касается внутренней реализации, Apple предоставляет парсер с открытым исходным кодом для форматов "старого стиля", XML и бинарных форматов в своём коде C Core Foundation под названием CFPropertyList. Однако все утилиты и большинство компонентов системы используют закрытый парсер NSPropertyList из Obj-C Foundation Kit. Реализация на Swift имеет открытый исходный код, но её идентичность не гарантируется.

Сериализация в плистику

Поскольку списки свойств не содержат всей информации и типов данных, необходимых для описания произвольного объекта, часто используется дополнительный уровень кодирования и декодирования. Спецификация OpenStep абстрагирует операцию сериализации любых объектов посредством протокола. Любой класс, реализующий этот протокол, может сериализовать свои экземпляры с помощью подкласса в другой формат. Существуют два основных кодера для сериализации объектов в plist: , который преобразует объект в блок бинарных данных, напоминающий структуру с тегами (tagged struct). Этот класс является частью OpenStep, хотя конкретный формат не определён. На практике его можно использовать для сериализации объекта в файл (без использования plist) или для встраивания данных в plist. Его необходимо читать и записывать в том же порядке, в котором он был записан. Введение устаревает его использование. , представленный в Mac OS X 10.2, преобразует объект в . Основное преимущество этого формата для программистов заключается в том, что он обращается к членам не по фиксированному порядку, а по строковым ключам. Внутри он в некоторой степени повторяет двоичный формат plist, храня массив таблицы объектов, называемый , в словаре. Вся остальная информация, включая информацию о классе, ссылается на указатель UID. Запись в словаре указывает на объект верхнего уровня, который программист намеревался закодировать. GNUstep также имеет совместимую реализацию, которая не ограничивает форматы вывода.

Язык пути

Для списков свойств не существует единого, стандартизированного языка запросов, как XPath для XML, однако существуют неформальные соглашения, используемые различными программами. Версия с точечным синтаксисом встречается в аргументе keypath в программах Apple, которые, по-видимому, устанавливаются вместе с Safari или являются производными от них. В Windows файлы обычно имеют бинарный формат, хотя некоторые приложения могут создавать PLIST-файлы в других форматах. В Windows файлы plist от Apple хранятся в домашней директории пользователя в папке. Эти plist-файлы в Windows обычно хранят настройки и другую информацию, а не используют реестр Windows. Возможности редактирования PLIST-файлов в Windows менее широки, чем в macOS. Если файл имеет формат XML или JSON, то с осторожностью можно использовать текстовый редактор, например Notepad++. Apple поставляет plutil.exe в составе пакета "Apple Application Support" (который входит в iTunes), и он идентичен своей версии для macOS.

NetBSD

Внедренная в 2006 году и впервые выпущенная вместе с NetBSD#4.0 (2007) — это библиотека proplib, которую можно использовать для сериализации данных между ядром и пользовательским пространством. Она реализует часть языка XML plist. Один из примеров использования proplib — вторая редакция фреймворка sysmon envsys для мониторинга системы. Библиотека proplib NetBSD также была портирована на DragonFly в 2010 году и доступна начиная с DragonFly BSD#2.8.

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

Реализация Facebook с открытым исходным кодом инструмента сборки Xcode, xcbuild, содержит библиотеку plist, а также кроссплатформенные утилиты, написанные на C++. Язык программирования Python имеет встроенный модуль для чтения и записи plist-файлов в формате XML от Apple или в двоичном (начиная с Python 3.4). ProperTree — это кроссплатформенный редактор, использующий эту библиотеку. Сторонняя библиотека ccl bplist обладает дополнительной возможностью обработки NSKeyedArchiver UID. В Go есть пакет, поддерживающий четыре типа plist: OpenStep text, GNUStep text, Apple XML и Apple Binary. Он также обрабатывает UID в XML и двоичных форматах.