Seznam nemovitostí - Property list
Přípona názvu souboru | .plist |
---|---|
Typ internetového média | application / x-plist |
Jednotný identifikátor typu (UTI) | com.apple.property-list |
Vyvinul | Počítač Apple a GNUstep, dříve Další |
Typ formátu | Serializace z slovník předměty. |
V Operační Systém Mac, iOS, Další krok, a GNUstep programování rámce, seznam vlastností soubory jsou soubory, které se ukládají serializováno předměty. Soubory seznamu vlastností používají přípona souboru .plist, a proto jsou často označovány jako p-seznam soubory.
Soubory seznamu vlastností se často používají k uložení nastavení uživatele. Používají se také k ukládání informací o svazky a aplikace, úkol obsluhovaný vidlice zdroje ve starém Mac OS.
Seznamy vlastností se také používají pro lokalizace řetězce pro rozvoj. Tyto soubory používají .struny nebo .stringsdict rozšíření. První z nich je „redukovaný“ starististický plist obsahující pouze jeden slovník bez složených závorek (viz propertyListFromStringsFileFormat),[1] zatímco druhý je plnohodnotný plist. XCode také používá a .pbxproj rozšíření pro staré styly použité jako soubory projektu.
Zastoupení
Protože data představovaná seznamy vlastností jsou poněkud abstraktní, podkladové formát souboru lze implementovat mnoha způsoby. A to, Další krok použil jeden formát k představení seznamu vlastností a následující GNUstep a Operační Systém Mac rámce zavedly různé formáty.
Další krok
Pod Další krok, seznamy nemovitostí byly navrženy tak, aby byly čitelné člověkem a ručně upraveny, serializovány do ASCII v syntaxi něco jako a programovací jazyk. Stejný formát používal OpenStep.
- Řetězce jsou reprezentovány ve stylu C literálu:
"Toto je řetězec plistu n"
; jednodušší řetězce bez uvozovek jsou povoleny, pokud se skládají z alfanumerických a jednoho z _$+/:.-. - Binární data jsou reprezentována jako:
< [hexadecimální kódy v ASCII] >
. Mezery a komentáře mezi spárovanými hexadecimálními kódy jsou ignorovány. - Pole jsou reprezentovány jako:
( "1", "2", "3" )
. Koncové čárky jsou tolerovány. - Slovníky jsou reprezentovány jako:
{"key" = "hodnota"; ...}
. Levá strana musí být řetězec, ale může být bez uvozovek. - Komentáře jsou povoleny jako:
/ * Toto je komentář * /
a// Toto je řádkový komentář
. - Stejně jako v jazyce C jsou mezery obecně syntaxe zanedbatelné. Hodnotové příkazy jsou zakončeny středníkem.
Jedním omezením původního formátu seznamu vlastností NeXT je to, že nemohl představovat objekt NSValue (číslo, logická hodnota atd.). Ve výsledku by tyto hodnoty musely být převedeny na řetězec a „fuzzy“ obnoveny aplikací.[2] Dalším omezením je, že není definováno žádné oficiální 8bitové kódování.[3]
The výchozí hodnoty obslužný program, představený v OpenStep (1998), lze použít k manipulaci se soubory plist používanými pro ukládání předvoleb (známé jako výchozí hodnoty v NeXTSTEP, odtud název) na příkazovém řádku přes jejich doménu předvoleb a tento nástroj lze použít k úpravám libovolných souborů plist. Tento nástroj nahradil tři starší příkazy.[4]
GNUstep
GNUstep přijímá formát NeXTSTEP s dodatky pro reprezentaci datových typů NSValue a NSDate. Nové zadané položky mají formulář <*T...>, kde T je jednopísmenný kód typu. Například NSValue boolean YES je reprezentována jako <*BY> a objekty NSDate jsou reprezentovány jako <*DYYYY-MM-DD HH:MM:SS +ZZZZ>.[5][6] Binární data lze také využít efektivněji base64 formátovat jako <[ b64... ]>. 8bitový problém je implicitně také vyřešen, protože většina nasazení používá UTF-8. Celkově vzato, NSPropertyListGNUstepFormat přináší expresivitu a kompaktnost lidsky čitelného textového formátu na stejné úrovni jako formát XML společnosti Apple.
GNUstep má také svůj vlastní binární formát, NSPropertyListGNUstepBinaryFormat, implementováno v NSSerializace. Tento formát je definován rekurzivně jako textové formáty, přičemž některá data předchází jednobajtová značka typu. Forma provázek řetězce je podporován prostřednictvím rozšíření GS shouldBeCompact přepínač.[7]
V GNUstepu se nacházejí dva relativně nezávislé obsluhy plistů: the CFPropertyList v libs-core-base (CoreFoundation) a NSPropertyList v libs-base (Foundation Kit). Oba do určité míry podporují binární a XML formy používané v macOS, ale ta druhá je mnohem úplnější. Například dva formáty specifické pro GNUstep jsou zpracovávány pouze v druhém.[8]
GNUstep poskytuje sadu nástrojů příkazového řádku plist založených na NSPropertyList, včetně verze pl[9] a výchozí hodnoty.[4]
Operační Systém Mac
Zatímco macOS umí číst také formát NeXTSTEP, Apple jej odloží ve prospěch dvou nových vlastních formátů, jednoho založeného na XML a druhého binárního. Apple má také částečně kompatibilní formát JSON (NSJSONSerializace).
Dějiny
v Mac OS X 10.0, byl formát NeXTSTEP zastaralé a nový XML byl zaveden formát s veřejností DTD definován Jablko. Formát XML podporuje jiné znaky než ASCII a ukládání objektů NSValue (což na rozdíl od formátu seznamu vlastností ASCII GNUstep, formát seznamu vlastností ASCII společnosti Apple nepodporuje).[10]
Vzhledem k tomu, že soubory XML nejsou prostorově nejefektivnějším prostředkem úložiště, Mac OS X 10.2 představil nový formát, kde jsou soubory seznamu vlastností uloženy jako binární soubory. Začínání s Mac OS X 10.4, toto je výchozí formát souborů preferencí. v Mac OS X 10.7, podpora pro čtení a zápis souborů v systému Windows JSON byl zaveden formát. Seznamy JSON a seznamy vlastností však nejsou navzájem plně kompatibilní. Například seznamy vlastností mají nativní datum a datové typy, které formát JSON nepodporuje. Naopak JSON povoluje nula hodnoty, zatímco seznamy vlastností nepodporují explicitní hodnoty null.
Nástroje
Starý výchozí hodnoty nástroj od NeXTSTEP zůstává k dispozici. The / usr / libexec / PlistBuddy příkaz poskytuje interaktivní editor plistu. Lze jej také skriptovat.[11]
The plutil obslužný program (představen v roce 2006) Mac OS X 10.2 ) lze použít ke kontrole syntaxe seznamů vlastností nebo k převodu souboru seznamu vlastností z jednoho formátu do jiného. Podporuje také převod plistů na objektové literály Objective-C nebo Swift.[12] Jako kakao NSPropertyListSerialization je postaven na, bere „staré“ vstupy, ale na tento typ se nepřevede. (Kakao NSSerializer dříve než Mac OS X 10.2 vydává výstup ve starém stylu.)
The pl nástroj je představen v systému Mac OS X v10.5. Zabere jakýkoli vstup a pokusí se vygenerovat „staré“ seznamy.[13][A] Stejně jako verze GNUstep se zdá, že používá popis vlastnost typů Foundation nalezených v plistech, které společnost Apple zadala k vytvoření platných starých stylů.[b]
Pokud jde o interní prvky, Apple poskytuje analyzátor open source pro starý styl, XML a binární formáty v jejich C Základní nadace kód jako CFPropertyList. Všechny nástroje a většina částí systému však používají analyzátor NSPropertyList uzavřeného zdroje ze sady Obj-C Foundation Kit. Reimplementace Swift je otevřený zdroj, ale není zaručeno, že bude identická.
Formát
XML a JSON seznamy vlastností lze ručně upravovat v libovolném textovém editoru. Apple navíc poskytuje podporu v Xcode pro úpravy seznamů vlastností v hierarchickém prohlížeči / editoru, který dokáže zpracovat seznamy formátované v binárním nebo XML, ale ne JSON. Do Mac OS X 10.4, Apple poskytuje AppleScript rozhraní pro čtení souborů se seznamy vlastností prostřednictvím aplikace Systémové události. Do Mac OS X 10.5, Apple poskytuje AppleScript rozhraní pro úpravy, vytváření a zápis souborů seznamů vlastností.[14]
U formátu XML jsou značky, související třídy Foundation a typy CoreFoundation a formáty úložiště dat následující:
Třída nadace | Typ CoreFoundation | Značka XML | Formát úložiště |
---|---|---|---|
NSString | CFString | <string> | Řetězec kódovaný UTF-8 |
NSNumber | CFNumber | <real>, <integer> | Desetinný řetězec; reals může mít exponenty, nebo může být nekonečno (inf) nebo NaN (nan). |
NSNumber | CFBoolean | <true/>, <false/> | Žádná data (pouze značka) |
NSDate | CFDate | <date> | ISO 8601 formátovaný řetězec |
NSData | CFData | <data> | Base64 zakódovaná data |
NSArray | CFArray | <array> | Může obsahovat libovolný počet podřízených prvků. Může být prázdný. |
NSDictionary | CFDictionary | <dict> | Střídavě <key> značky a značky prvku plist. Může být prázdný. |
The Binární soubor formát je dokumentován v bloku komentářů v Základní nadace Zdrojový soubor kódu C (CF / CFBinaryPList.c) pro otevřenou implementaci binárních seznamů Apple v její knihovně Foundation.[15] Apple popisuje implementaci jako neprůhlednou v dokumentaci manuálové stránky plist (5),[16] což znamená, že se nedoporučuje spoléhat se na formát. Ve formátu binárního souboru je magické číslo (prvních několik bajtů souboru, které naznačují, že se jedná o platný soubor plist) text bplist, následovaný dvěma bajty označujícími verzi formátu.
Binární soubor může ukládat některé informace, které nelze zachytit ve formátech souborů XML nebo JSON. Binární typy pole, množiny a slovníku jsou tvořeny ukazatele - položky objref a keyref - tento index do tabulky objektů v souboru. To znamená, že binární seznamy mohou zachytit skutečnost, že například samostatné pole a slovník serializovaný do souboru mají v sobě uloženy stejný datový prvek. To nelze zachytit do souboru XML. Převod takového binárního souboru bude mít za následek vložení kopie datového prvku do souboru XML. Binární soubor má navíc typ UID, který se používá k identifikaci datových položek při serializaci. Úplný seznam dat, která lze uložit převzatá ze zdrojového souboru kódu C, je následující:
Třída nadace | Typ CoreFoundation | Typ objektu | Bajt značky | Zakódovaná data |
---|---|---|---|---|
nula | nula | nula (v „1?“ +) | 0000 0000 | n / a |
NSNumber | CFBoolean | bool | 0000 1000 (false) 0000 1001 (true) | n / a |
NSURL | CFURL | url (v „1?“ +) | 0000 1100 (základní řetězec) 0000 1001 (řetězec) | string: URL řetězec v rekurzivním kódování (jako ve "formátu objektu řetězce?"); základní řetězec: stejný, ale nejprve se zakódovanou základní adresou URL. |
NSUUID | CFUUID | uuid (v „1?“ +) | 0000 1110 | 16 bajtů UUID |
vyplnit | 0000 1111 | nic - jen polstrování | ||
NSNumber | CFNumber | int | 0001 nnnn | # of bytes is 2 ^ nnnn, big-endian bytes (1, 2, 4, or 8) |
NSNumber | CFNumber | nemovitý | 0010 nnnn | # of bytes is 2 ^ nnnn, big-endian bytes (4 or 8) |
NSDate | CFDate | datum | 0011 0011 | Následuje 8 byte float, big-endian bajty; sekundy od 1. 1. 2001 (Základní data epocha) |
NSData | CFData | data | 0100 nnnn [int] | nnnn je počet bajtů, pokud není 1111, pak následuje počet int, následovaný bajty |
NSString | CFString | tětiva | 0101 nnnn [int] | Řetězec ASCII, nnnn je počet znaků, jinak 1111 pak počet int, pak bajty |
NSString | CFString | tětiva | 0110 nnnn [int] | Řetězec Unicode, nnnn je počet znaků, jinak 1111 pak počet int, pak big-endian 2-byte uint16_t |
NSString | CFString | tětiva (v „1?“ +) | 0111 nnnn [int] | Řetězec UTF-8, nnnn je počet znaků, jinak 1111 pak počet int, pak bajty |
NSNumber | CFNumber | UID | 1 000 nnnn | nnnn + 1 je # big-endian bajtů (1, 2, 4 nebo 8). Nepodepsaný int, pouze producent NSKeyedArchiver (viz. níže).[17] |
NSArray | CFArray | pole | 1010 nnnn [int] | objref * nnnn je count, pokud není '1111', následuje int count |
NSOrderedSet | ordset (v „1?“ +) | 1011 nnnn [int] | objref * nnnn je count, pokud není '1111', následuje int count | |
NSSet | CFSet | soubor (v „1?“ +) | 1100 nnnn [int] | objref * nnnn je count, pokud není '1111', následuje int count |
NSDictionary | CFDictionary | diktát | 1101 nnnn [int] | keyref * objref * nnnn je count, pokud není '1111', následuje int count |
Všimněte si v „1?“ + poznámka v mnoha typech. To znamená, že bajt značky se nachází pouze v souborech s verzí formátu ne nižší než „1?“ magické číslo. Přesný způsob, jak je analyzovat, je mlhavější než způsob, jak analyzovat starší typy, protože implementace CFBinaryPlist zpracovává pouze verzi „0?“. V praxi se tyto typy nikdy nesetkají, protože NSKeyedArchiver je již schopen tyto informace zachytit.
Tabulka offsetů následuje tabulku objektů, za kterou následuje upoutávka obsahující informace o velikosti a umístění obou tabulek.
Serializace na plist
Protože seznamy vlastností nezachycují všechny informace a datové typy potřebné k popisu libovolného objektu, často se provádí další vrstva kódování a dekódování. Specifikace OpenStep abstrahuje operaci serializace libovolného NSObject pod NSCoding protokol. Libovolná třída implementující tento protokol může mít své instance serializované pomocí a NSCoder podtřída do jiného formátu.[18] Pro účely serializace objektů na seznamy existují dva hlavní kodéry:
- NSArchiver, který převádí objekt na blok binárních dat podobně jako tagovaná struktura. Tato třída je součástí OpenStep, ačkoli nebyl definován žádný konkrétní formát. V praxi je možné jej použít k serializaci objektu do souboru (přeskočení plistu) nebo k vložení dat do plistu. Musí být čteny a psány ve stejném pořadí, v jakém jsou psány. Zavedení NSKeyedArchiver odmítá jeho použití.
- NSKeyedArchiver, představený v systému Mac OS X 10.2, transformuje objekt na NSDictionary. Hlavní vylepšení tohoto formátu pro programátory spočívá v tom, že přistupuje ke členům nikoli podle pevného pořadí, ale pomocí řetězcových klíčů. Interně poněkud rekapituluje formát binárního plistu uložením pole tabulky objektů s názvem $ objekty ve slovníku. Na všechno ostatní, včetně informací o třídě, odkazuje UID ukazatel. A $ top položka pod diktátem ukazuje na objekt nejvyšší úrovně, který měl programátor v úmyslu kódovat.[17]
Použití archivátoru mimo jiné umožňuje kódování nových datových typů, aniž by se měnil samotný formát plistu, a je to upřednostňovaný způsob, jak Apple kóduje věci jako NSSets a nulové hodnoty. Analýza formátů se ukázala o něco těžší, protože i u některých tříd musí plists podporovat jednu další vrstvu. Stejně jako v binárním formátu, který má také tabulku objektů, je možné v něm vytvářet kruhové odkazy NSKeyedArchiver. Protože v XML neexistuje datový typ UID, jsou celá čísla uložena ve slovníku pod klíčem „CF $ UID“.[19]
Apple vydává open-source NSKeyedArchiver v nadaci Swift Corelibs; podobně jako nadace Apple s uzavřeným zdrojem omezuje výstupní formáty pouze na binární a XML. Má také několik testovacích případů zobrazujících výsledky serializace.[20] GNUstep má také kompatibilní implementaci, která neomezuje výstupní formáty.[21]
Jazyk cesty
Pro seznamy vlastností neexistuje jediný standardizovaný jazyk cesty XPath dělá pro XML, ale existují neformální konvence používané různými programy.
- Verze syntaxe teček se nachází v souboru klíčová cesta argument Apple plutil. Zdá se, že to pochází z
(id) - [NSObject (NSKeyValueCoding) valueForKeyPath:]
.[12] - Jiný formát používá PlistBuddyse syntaxí dvojtečky pro indexování.[11]
Ani jeden formát není schopen vyjádřit klíč se znakem oddělovače.
Jiné platformy
Okna
Ačkoli jsou soubory plist nejlépe známé v systémech Apple nebo Darwin, včetně iOS a macOS, jsou také přítomny v počítačích Windows, když software Apple, jako je iTunes[22] nebo Safari[23] jsou nainstalovány. Ve Windows jsou to obvykle binární soubory,[24] i když některé aplikace mohou generovat soubory PLIST v jiných formátech.
Ve Windows jsou soubory Apple plist uloženy v domovském adresáři uživatele pod % USERPROFILE% AppData Roaming Apple Computer. Tyto soubory plist v systému Windows obvykle ukládají předvolby a další informace namísto použití registru Windows.
Možnosti úprav souborů PLIST ve Windows nejsou tak rozsáhlé jako v macOS. Pokud je soubor ve formátu XML nebo JSON opatrně, použije se textový editor, jako je Poznámkový blok ++ může být použito. Apple dodává plutil.exe v rámci svého balíčku „Apple Application Support“ (který je součástí iTunes ), a je totožný s jeho protějškem pro macOS.
NetBSD
Představeno v roce 2006 a poprvé vydáno s NetBSD # 4.0 (2007) je knihovna proplib, kterou lze použít k serializaci dat mezi jádrem a uživatelskou zemí. Implementuje část jazyka XML plist.[25]
Jedním z ukázkových uživatelů proplibu je druhá revize sysmonu envsys rámec pro monitorování systému.
Knihovna proplib NetBSD byla také portována na DragonFly v roce 2010 a je k dispozici od roku DragonFly BSD # 2.8.[26]
Cross-platform
- Facebook open-source reimplementace Xcode nástroj pro sestavení, xcbuild, obsahuje knihovnu plist a také plutil a PlistBuddy. Tyto nástroje pro různé platformy jsou napsány C ++.[27]
- The Programovací jazyk Python má vestavěný
plistlib
modul pro čtení a zápis souborů plist v XML společnosti Apple nebo v binárním formátu (od Pythonu 3.4).[28] ProperTree je editor pro různé platformy, který tuto knihovnu využívá.[29]- Knihovna třetí strany s názvem ccl-bplist má další schopnost zpracovávat UID NSKeyedArchiver.[19]
- Jít má
plist
balíček, který podporuje čtyři typy plistů: OpenStep text, GNUStep text, Apple XML a Apple Binary. Zpracovává také UID v XML a binárních formátech.[2]
Viz také
Poznámky
Reference
- ^ "Odkaz na třídu NSString: propertyListFromStringsFileFormat". GNUstep. Citováno 17. února 2020.
- ^ A b "Balíček plist". godoc.org.
Když Unmarshal narazí na seznam vlastností OpenStep, přejde do režimu uvolněné analýzy: Seznamy vlastností OpenStep mohou ukládat pouze obyčejná stará data jako řetězce, takže se pokusíme obnovit celočíselné, plovoucí desetinné čárky, booleovské hodnoty a hodnoty data, kdykoli je to nutné.
- ^ "Seznamy vlastností ASCII ve starém stylu". Apple Developer (Průvodce programováním seznamu vlastností). Citováno 16. února 2020.
- ^ A b Linux Obecné příkazy Manuál –
- ^ Frith-Macdonald, Richard (2004). "Dokumentace třídy NSPropertyListSerialization". GNUstep.
- ^ "Seznamy nemovitostí". GNUstepWiki.
- ^ „Dokumentace k serializaci NSS“. GNUstep. zdrojový kód
- ^ "Typy a konstanty: NSPropertyListFormat". gnustep.org.
- ^ Linux Obecné příkazy Manuál –
- ^ "appleexaminer.com:" PLIST soubory"". Archivovány od originál dne 19. února 2014. Citováno 27. února 2014.
- ^ A b Darwine a Operační Systém Mac Správce systému Manuál –
- ^ A b Darwine a Operační Systém Mac Obecné příkazy Manuál –
- ^ Darwine a Operační Systém Mac Obecné příkazy Manuál –
- ^ „AppleScript: Seznamy vlastností“. 24. dubna 2009. Archivovány od originál 24. dubna 2009.
- ^ A b „CF / CFBinaryPList.c“. Apple Open Source. Citováno 6. ledna 2020.
- ^ Darwine a Operační Systém Mac Formáty souborů Manuál –
- ^ A b Caithness, Alex (4. dubna 2012). „Geek post: NSKeyedArchiver files - what are they, and how can I use them?“. Digitální vyšetřování.
Datový typ CF $ UID v seznamu 2 je slovník s jediným klíčem („CF $ UID“), za nímž následuje celé číslo (toto rozložení je to, co uvidíte, když je seznam vlastností reprezentován v XML; v raw binární formát, datový typ „UID“ je samostatná entita, která nevyžaduje slovníkovou strukturu). Tyto datové typy představují odkaz na jinou entitu v poli „$ objects“. Číslo CF $ UID udává pozici pole.
- ^ „NSCoder.html“. Specifikace OpenStep.
- ^ A b CCLForensics Group (15. ledna 2020). „cclgroupltd / ccl-bplist“. GitHub.
- ^ „apple / swift-corelibs-foundation: NSKeyedArchiver.swift“. GitHub. testy
- ^ „Dokumentace NSKeyedArchiver“. Dokumentace GNUstep. Citováno 23. února 2020. zdrojový kód
- ^ „Zálohování iTunes - iPhone Wiki“. www.theiphonewiki.com.
- ^ „Jak webový prohlížeč Apple Safari ukládá svá nastavení ve Windows?“. Super uživatel.
- ^ „GitHub - Microsoft / NSPlist: NSPlist“. 3. května 2019 - prostřednictvím GitHub.
- ^ Jason R. Thorpe. "proplib - knihovna objektů kontejneru vlastností". NetBSD. Shrnutí ležel.
- ^ Jason R. Thorpe. "proplib - knihovna objektů kontejneru vlastností". DragonFly BSD. Shrnutí ležel.
- ^ „facebook / xcbuild / Knihovny / plist“. GitHub. Citováno 17. února 2020.
- ^ „plistlib - generování a analýza souborů .plist systému Mac OS X“. Dokumentace k Pythonu 3. Citováno 6. ledna 2020.
- ^ "corpnewt / ProperTree: Cross platform GUI plist editor written in python". GitHub. 17. února 2020. Citováno 17. února 2020.