Из Википедии, бесплатной энциклопедии
  (Перенаправлено с Plist )
Перейти к навигации Перейти к поиску

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

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

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

Представления [ править ]

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

NeXTSTEP [ править ]

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

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

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

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

GNUstep [ править ]

GNUstep принимает формат NeXTSTEP с дополнениями для представления типов данных NSValue и NSDate. Новые типизированные записи имеют вид <* T ...> , где T - однобуквенный код типа. Например, значение 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-extension 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, определенным Apple . Формат 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, а списки свойств не поддерживают явные значения NULL.

Инструменты [ править ]

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

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

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

Что касается внутреннего устройства, Apple предоставляет синтаксический анализатор с открытым исходным кодом для старого стиля, XML и двоичных форматов в своем коде C Core Foundation как 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, а также форматы хранения данных:

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

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

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

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

Сериализация в plist [ править ]

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

  • NSArchiver , который преобразует объект в блок двоичных данных, наподобие тегированной структуры. Этот класс является частью OpenStep, хотя конкретный формат не определен. На практике его можно использовать для сериализации объекта в файл (пропуская plist) или для встраивания данных в plist. Его необходимо читать и писать в том же порядке, в котором написано. Введение NSKeyedArchiver осуждает его использование.
  • NSKeyedArchiver , представленный в Mac OS X 10.2, преобразует объект в NSDictionary . Основное улучшение этого формата для программистов заключается в том, что он обращается к членам не по фиксированному порядку, а по строковым ключам. Внутри он в некоторой степени повторяет формат двоичного списка, сохраняя в словаре массив таблиц объектов с именем $ objects . На все остальное, включая информацию о классе, ссылается указатель UID. Запись $ top под 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 plutil . Похоже, что это происходит от . [12](id) -[NSObject(NSKeyValueCoding) valueForKeyPath:]
  • 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, с осторожностью можно использовать текстовый редактор, например Notepad ++ . 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, а также plutil и PlistBuddy . Эти кроссплатформенные утилиты написаны на C ++ . [27]
  • В языке программирования Python есть встроенный plistlibмодуль для чтения и записи файлов plist в формате Apple XML или в двоичном формате (начиная с Python 3.4). [28] ProperTree - это кроссплатформенный редактор, использующий эту библиотеку. [29]
    • Сторонняя библиотека ccl-bplist имеет дополнительную возможность обрабатывать UID NSKeyedArchiver. [19]
  • Go имеет plistпакет, который поддерживает четыре типа списков: текст OpenStep, текст GNUStep, Apple XML и Apple Binary. Он также обрабатывает UID в XML и двоичных форматах. [2]

См. Также [ править ]

  • Сравнение форматов сериализации данных

Заметки [ править ]

  1. ^ Причуда Macos пл является точто он ставит паразитный «D» символ в стандартный выводесли вручную ввел стандартный ввод и прекратил ее с ^ D .
  2. ^ ВdescriptionObj-C FoundationNSDataесть ошибки в том, что он возвращает словарное представление. У Swift Foundation с открытым исходным кодом такой проблемы нет.

Ссылки [ править ]

  1. ^ "Ссылка на класс NSString: propertyListFromStringsFileFormat" . GNUstep . Проверено 17 февраля 2020 года .
  2. ^ a b "Список пакетов" . godoc.org . Когда Unmarshal встречает список свойств OpenStep, он переходит в расслабленный режим синтаксического анализа: списки свойств OpenStep могут хранить только простые старые данные в виде строк, поэтому мы попытаемся восстановить целые числа, значения с плавающей запятой, логические значения и даты везде, где они необходимы.
  3. ^ «Списки свойств ASCII в старом стиле» . Разработчик Apple (Руководство по программированию списка свойств) . Проверено 16 февраля 2020 года .
  4. ^ a b defaults(1)  -  Руководство по основным командам Linux
  5. ^ Фрит-Макдональд, Ричард (2004). «Документация класса NSPropertyListSerialization» . GNUstep .
  6. ^ "Списки собственности" . GNUstepWiki .
  7. ^ "Документация по NSSerialization" . GNUstep . исходный код
  8. ^ «Типы и константы: NSPropertyListFormat» . gnustep.org .
  9. ^ pldes(1)  -  Руководство по основным командам Linux
  10. ^ "appleexaminer.com:" файлы PLIST " " . Архивировано из оригинального 19 -го февраля 2014 года . Проверено 27 февраля 2014 года .
  11. ^ a b PlistBuddy(8)  -  Дарвин и руководство администратора системы macOS
  12. ^ a b plutil(1)  -  Руководство по основным командам Darwin и macOS
  13. ^ pl(1)  -  Дарвин и руководство по основным командам macOS
  14. ^ «AppleScript: списки свойств» . 24 апреля 2009 года Архивировано из оригинального 24 -го апреля 2009 года.
  15. ^ a b "CF / CFBinaryPList.c" . Открытый исходный код Apple . Проверено 6 января 2020 года .
  16. ^ plist(5)  -  Руководство по форматам файлов Darwin и macOS
  17. ^ a b Кейтнесс, Алекс (4 апреля 2012 г.). "Сообщение компьютерщика: файлы NSKeyedArchiver - что это такое и как я могу их использовать?" . Цифровое расследование . Тип данных CF $ UID в листинге 2 представляет собой словарь с одним ключом («CF $ UID»), за которым следует целое число (этот макет - это то, что вы увидите, когда список свойств представлен в XML; в исходном двоичный формат (тип данных «UID» - это отдельная сущность, не требующая структуры словаря). Эти типы данных представляют собой ссылку на другую сущность в массиве «$ objects». Номер CF $ UID дает позицию в массиве.
  18. ^ "NSCoder.html" . Спецификация OpenStep .
  19. ^ a b CCLForensics Group (15 января 2020 г.). "cclgroupltd / ccl-bplist" . GitHub .
  20. ^ "яблоко / swift-corelibs-foundation: NSKeyedArchiver.swift" . GitHub . тесты
  21. ^ "Документация NSKeyedArchiver" . Документация GNUstep . Проверено 23 февраля 2020 года . исходный код
  22. ^ «iTunes Backup - 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: кроссплатформенный редактор plist GUI, написанный на python" . GitHub . 17 февраля 2020 . Проверено 17 февраля 2020 года .

Внешние ссылки [ править ]

  • Страница руководства plist (5) на сайте developer.apple.com
  • Надстройка Excel для создания файла plist из таблицы Excel
  • Java API для чтения / записи различных форматов списков - совместим с Android
  • EBNF-грамматика GNUstep-листов