Jump to content

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

(Перенаправлено с Proplib(3) )

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

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

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

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

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

[ редактировать ]

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

В 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]

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

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 , реализованный в НССериализация . Этот формат определяется рекурсивно, как и текстовые форматы, с однобайтовым маркером типа, предшествующим некоторым данным. Форма интернирования строк поддерживается через GS-расширение. должен быть компактным переключателем. [7]

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

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

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

В 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]

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

The Утилита pl представлена ​​в Mac OS X v10.5. Он принимает любые входные данные и пытается создать списки «старого стиля». [13] [а] Как и версия 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 предоставляет интерфейс AppleScript для редактирования, создания и записи файлов списков свойств. , Apple также [14]

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

Базовый класс Тип CoreFoundation XML-тег Формат хранения
НСстринг CFString <строка> Строка в кодировке UTF-8
НСномер CFNumber <действительное>, <целое> Десятичная строка; Реалистические числа могут иметь показатели степени или быть бесконечностью (inf) или NaN (nan).
НСномер CFBoolean <истина/>, <ложь/> Нет данных (только тег)
НСДата Дата CFD <дата> ISO 8601 Строка в формате
НСдата CFData <данные> Base64 Данные в кодировке
НСаррай CFArray <массив> Может содержать любое количество дочерних элементов. Может быть пустым.
NSDictionary CFDictionary <диктат> Чередование <key> Теги и теги элементов plist. Может быть пустым.

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

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

Форматы объектов двоичных списков (начиная с CoreFoundation 1153) [15]
Базовый класс Тип CoreFoundation Тип объекта Байт маркера Закодированные данные
ноль ноль ноль (v"1?"+) 0000 0000
НСномер CFBoolean логическое значение 0000 1000 (ложь)
0000 1001 (правда)
НГУУРЛ КФУРЛ URL (v"1?"+) 0000 1100 (базовая строка)
0000 1101 (строка)
строка: строка URL-адреса в рекурсивном кодировании (как в «формате строкового объекта?»); базовая строка: то же самое, но сначала закодирован базовый URL.
НГУИД CFUUID uuid (v"1?"+) 0000 1110 16 байт UUID
наполнять 0000 1111 ничего - просто прокладка
НСномер CFNumber интервал 0001 нннн Количество байтов 2^nnnn , байты с прямым порядком байтов (1, 2, 4 или 8)
НСномер CFNumber настоящий 0010 нннн Количество байтов 2^nnnn , байты с прямым порядком байтов (4 или 8)
НСДата Дата CFD дата 0011 0011 Далее следует 8-байтовое число с плавающей запятой, байты с прямым порядком байтов; секунды с 01.01.2001 ( Core Data эпоха )
НСдата CFData данные 0100 нннн [целое] nnnn — это количество байтов, если не 1111, затем следует int count, а затем байты
НСстринг CFString нить 0101 нннн [целое] Строка ASCII, nnnn — это количество символов, иначе 1111, затем число целых чисел, затем байты.
НСстринг CFString нить 0110 нннн [целое] Строка Юникода, nnnn — это количество символов, иначе 1111, затем число int, затем 2-байтовый uint16_t с обратным порядком байтов.
НСстринг CFString строка (v"1?"+) 0111 нннн [целое] Строка UTF-8, nnnn — это количество символов, иначе 1111, затем число целых чисел, затем байты.
UID 1000 нннн nnnn+1 — количество байтов с прямым порядком байтов (1, 2, 4 или 8). Беззнаковое целое число, создается только NSKeyedArchiver (см. ниже). [17]
НСаррай CFArray множество 1010 нннн [целое] objref* nnnn — это счетчик, если не указано «1111», тогда следует int count
НСОрдедерсет набор ордсов (v"1?"+) 1011 нннн [целое] objref* nnnn — это счетчик, если не указано «1111», тогда следует int count
НСсет CFSet установить (v"1?"+) 1100 ннн [целое] objref* nnnn — это счетчик, если не указано «1111», тогда следует int count
NSDictionary CFDictionary диктовать 1101 нннн [целое] keyref* objref* nnnn считается, если не '1111', тогда следует int count

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

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

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

[ редактировать ]

Поскольку списки свойств не охватывают всю информацию и типы данных, необходимые для описания произвольного объекта, часто выполняется дополнительный уровень кодирования и декодирования. Спецификация 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. плютил . Кажется, это происходит от (id) -[NSObject(NSKeyValueCoding) valueForKeyPath:]. [12]
  • Другой формат используется PlistBuddy с синтаксисом двоеточия для индексации. [11]

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

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

[ редактировать ]

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

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

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

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

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

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

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

[ редактировать ]
  • Реализация Facebook с открытым исходным кодом инструмента сборки Xcode , xcbuild, содержит библиотеку plist, а также плютил и ПлистБадди . Эти кроссплатформенные утилиты написаны на 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 pl заключается в том, что он помещает случайный символ «D» в стандартный вывод, если кто-то вручную ввел стандартный ввод и завершил его с помощью .
  2. ^ description в Фонде Obj-C NSData является ошибочным в том смысле, что возвращает словарное представление. У Swift Foundation с открытым исходным кодом такой проблемы нет.
  1. ^ «Ссылка на класс NSString: propertyListFromStringsFileFormat» . GNUшаг . Проверено 17 февраля 2020 г.
  2. ^ Перейти обратно: а б «Список пакетов» . godoc.org . Когда Unmarshal обнаруживает список свойств OpenStep, он переходит в режим расслабленного анализа: списки свойств OpenStep могут хранить только старые данные в виде строк, поэтому мы попытаемся восстановить целые числа, значения с плавающей запятой, логические значения и значения даты там, где они необходимы.
  3. ^ «Списки свойств ASCII старого стиля» . Apple Developer (Руководство по программированию списка свойств) . Проверено 16 февраля 2020 г.
  4. ^ Перейти обратно: а б 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. ^ Перейти обратно: а б PlistBuddy(8) Darwin и macOS системного администратора Руководство
  12. ^ Перейти обратно: а б plutil(1) Darwin и macOS по общим командам Руководство
  13. ^ pl(1) Darwin и macOS по общим командам Руководство
  14. ^ «AppleScript: списки свойств» . 24 апреля 2009 г. Архивировано из оригинала 24 апреля 2009 г.
  15. ^ Перейти обратно: а б "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. ^ Перейти обратно: а б CCLForensics Group (15 января 2020 г.). "cclgroupltd/ccl-bplist" . Гитхаб .
  20. ^ «apple/swift-corelibs-foundation: NSKeyedArchiver.swift» . Гитхаб . 14 декабря 2021. тесты
  21. ^ «Документация NSKeyedArchiver» . Документация GNUstep . Проверено 23 февраля 2020 г. исходный код
  22. ^ Хаммерт, Кристиан; Хамфрис, Джорджина Луиза (2022), Хаммерт, Кристиан; Павлащик, Дирк (ред.), «Списки свойств» , Mobile Forensics – Справочник по форматам файлов: Общие форматы файлов и файловые системы, используемые в мобильных устройствах , Cham: Springer International Publishing, стр. 157–165, doi : 10.1007/978- 3-030-98467-0_6 , ISBN  978-3-030-98467-0 , получено 12 марта 2024 г.
  23. ^ «Как веб-браузер Apple Safari хранит свои настройки в Windows?» . Супер пользователь .
  24. ^ «GitHub — microsoft/NSPlist: NSPlist» . 3 мая 2019 г. – через GitHub.
  25. ^ Джейсон Р. Торп. «proplib — библиотека объектов-контейнеров свойств» . НетБСД .
  26. ^ Джейсон Р. Торп. «proplib — библиотека объектов-контейнеров свойств» . Драгонфлай БСД .
  27. ^ "facebook/xcbuild/Libraries/plist" . Гитхаб . Проверено 17 февраля 2020 г.
  28. ^ «plistlib — Генерация и анализ файлов .plist для Mac OS X» . Документация Python 3 . Проверено 6 января 2020 г.
  29. ^ «corpnewt/ProperTree: кроссплатформенный редактор списков с графическим интерфейсом, написанный на Python» . Гитхаб . 17 февраля 2020 г. . Проверено 17 февраля 2020 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 0ba5c46ab4b3cd9233b21de395cbb3e8__1721765580
URL1:https://arc.ask3.ru/arc/aa/0b/e8/0ba5c46ab4b3cd9233b21de395cbb3e8.html
Заголовок, (Title) документа по адресу, URL1:
Property list - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)