stringtranslate.com

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

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

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

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

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

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

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

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

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

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

GNUстеп

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

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

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

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

macOS

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

История

В Mac OS X 10.0 формат NeXTSTEP был объявлен устаревшим и был введен новый формат XML с общедоступным DTD, определенным Apple . Формат XML поддерживает символы, отличные от ASCII, и хранит объекты NSValue (которые, в отличие от формата списка свойств ASCII GNUstep, формат списка свойств ASCII Apple не поддерживает). [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 предоставляет интерактивный редактор plist. Это также может быть написано в сценарии. [11]

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

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

Что касается внутреннего устройства, 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 уже способен захватывать эту информацию.

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

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

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

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

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

Язык пути

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

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

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

Окна

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

В Windows файлы plist Apple хранятся в домашнем каталоге пользователя в папке %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 plist. [24]

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

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

Кросс-платформенный

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

Примечания

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

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

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

Внешние ссылки