プロパティリスト

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

プロパティリスト
ファイル名拡張子
.plist
インターネットメディアタイプ
application/x-plist
ユニフォームタイプ識別子(UTI)com.apple.property-list
によって開発されたApple ComputerGNUstep
以前はNeXT
フォーマットの種類辞書オブジェクトのシリアル化

macOSiOSNeXTSTEPおよびGNUstepプログラミングフレームワークでは、プロパティリストファイルはシリアル化された オブジェクトを格納するファイルです。プロパティリストファイルはファイル名拡張子を使用するため、 p-list.plistファイルと呼ばれることがよくあります。

プロパティリストファイルは、ユーザーの設定を保存するためによく使用されます。また、バンドルアプリケーションに関する情報を保存するためにも使用されます。これは、古いMacOS のリソースフォークによって提供されるタスクです。

プロパティリストは、開発用のローカリゼーション文字列にも使用されますこれらのファイルは.stringsまたは.stringsdict拡張子を使用します。前者は中括弧なしで1つの辞書のみを含む「縮小された」古いスタイルのplistであり(propertyListFromStringsFileFormatを参照)[1]、後者は本格的なplistです。Xcodeは、プロジェクトファイルとして使用される古いスタイルのplist の拡張機能も使用します。.pbxproj

表現

プロパティリストで表されるデータはやや抽象的であるため、基になるファイル形式はさまざまな方法で実装できます。つまり、NeXTSTEPはプロパティリストを表すために1つの形式を使用し、その後のGNUstepおよびmacOSフレームワークは異なる形式を導入しました。

NeXTSTEP

NeXTSTEPの下では、プロパティリストは人間が読めるように設計されており、手動で編集され、プログラミング言語のような構文でASCIIにシリアル化されています。これと同じ形式がOPENSTEPで使用されました。

  • 文字列はCリテラルスタイルで表されます:"This is a plist string\n"; 英数字と_ $ + /:.-のいずれかで構成されている限り、より単純で引用符で囲まれていない文字列を使用できます
  • バイナリデータは次のように表されますペアの16進コード間のスペースとコメントは無視されます。< [hexadecimal codes in ASCII] >
  • 配列は次のように表されます( "1", "2", "3" )末尾のコンマは許容されます。
  • 辞書は次のように表されます{ "key" = "value"; ... }左側は文字列である必要がありますが、引用符で囲むことはできません。
  • コメントは次のように許可されます:/* This is a comment */および// This is a line comment
  • Cの場合と同様に、空白は一般に構文にとって重要ではありません。値ステートメントはセミコロンで終了します。

元のNeXTプロパティリスト形式の制限の1つは、NSValue(数値、ブール値など)オブジェクトを表すことができないことです。その結果、これらの値は文字列に変換され、アプリケーションによって「あいまいに」回復される必要があります。[2]もう1つの制限は、公式の8ビットエンコーディングが定義されていないことです。[3]

OPENSTEP(1996)で導入されたデフォルトユーティリティを使用して、プリファレンスドメインを介してコマンドラインでプリファレンス(NeXTSTEPではデフォルトと呼ばれるため名前)を保存するために使用されるplistファイルを操作できます。任意のplistファイルを編集します。このユーティリティは、3つの古いコマンドに取って代わりました。[4]

GNUstep

GNUstepはNeXTSTEP形式を採用し、NSValueおよびNSDateデータ型を表すための追加があります。新しい型付きエントリの形式は<* T ...>です。ここで、Tは1文字の型コードです。たとえば、ブール値YESのNSValueは<* BY>として表され、NSDateオブジェクトは。として表されます。[5] [6]バイナリデータは、より効率的なbase64形式を<[b64 ...]>として使用することもできます。ほとんどのデプロイメントはUTF-8を使用するため、8ビットの問題も暗黙的に解決されます。全体として、NSPropertyListGNUstepFormatは、AppleのXML形式と同等の、人間が読めるテキスト形式の表現力とコンパクトさをもたらします。 <*DYYYY-MM-DD HH:MM:SS +ZZZZ>

GNUstepには、 NSSerializationで実装された独自のバイナリ形式NSPropertyListGNUstepBinaryFormatもありますこの形式は、テキスト形式と同様に再帰的に定義され、一部のデータの前に1バイト型のマーカーがあります。文字列インターンの形式は、GS拡張shouldBeCompactスイッチを介してサポートされます。[7]

GNUstepには2つの比較的独立したplistハンドラーがあります。libs -core-base(CoreFoundation)のCFPropertyListlibs-base(Foundation Kit)のNSPropertyListです。どちらもmacOSで使用されるバイナリ形式とXML形式をある程度サポートしていますが、後者の方がはるかに完全です。たとえば、2つのGNUstep固有の形式は後者でのみ処理されます。[8]

GNUstepは、 NSPropertyListに基づく一連のplistコマンドラインツールを提供します。これには、 pl [9]のバージョンデフォルトが含まれます。[4]

macOS

macOSはNeXTSTEP形式も読み取ることができますが、Appleはそれを脇に置いて独自の2つの新しい形式(1つはXMLベース、もう1つはバイナリ)を採用しています。Appleには、部分的に互換性のあるJSON形式(NSJSONSerialization)もあります。

歴史

Mac OS X 10.0では、NeXTSTEP形式は非推奨になり、 Appleによって定義されたパブリックDTDを使用して新しいXML形式が導入されました。XML形式は非ASCII文字とNSValueオブジェクトの格納をサポートします(GNUstepのASCIIプロパティリスト形式とは異なり、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コマンドは、インタラクティブなplistエディターを提供します。スクリプト化することもできます。[11]

plutilユーティリティ(Mac OS X 10.2で導入)を使用して、プロパティリストの構文を確認したり、プロパティリストファイルをある形式から別の形式に変換したりできます。また、plistをObjective-CまたはSwiftオブジェクトリテラルに変換することもサポートしています。[12]それが構築されているCocoaNSPropertyListSerializationと同様に、「古いスタイル」の入力を受け取りますが、このタイプには変換されません。Mac OS X10.2より前のCocoaNSSerializerは、古いスタイルの出力を出力します。)

plユーティリティはMacOS Xv10.5で導入されました入力を受け取り、「古いスタイル」のplistを生成しようとします。[13] [a] GNUstepバージョンと同様に、有効な古いスタイルのplistを生成するためにAppleが指定したplistにあるFoundationタイプのdescriptionプロパティを使用しているようです。[b]

内部的には、AppleはCFPropertyListとしてC Core Foundationコードで古いスタイル、XML、およびバイナリ形式のオープンソースパーサーを提供しています。ただし、すべてのユーティリティとシステムのほとんどの部分は、Obj-C FoundationKitのクローズドソースNSPropertyListパーサーを使用します。Swiftの再実装はオープンソースですが、同一であるとは限りません。

フォーマット

XMLおよびJSONプロパティリストは、任意のテキストエディタで手動で編集できます。さらに、AppleはXcodeで、 JSONではなくバイナリまたはXMLでフォーマットされたplistを処理できる階層型ビューア/エディタでプロパティリストを編集するためのサポートを提供していますMac OS X 10.4以降、Appleは、システムイベントアプリケーションを介してプロパティリストファイルを読み取るためのAppleScriptインターフェイスを提供してますMac OS X 10.5以降、Appleは、プロパティリストファイルを編集、作成、および書き込むためのAppleScriptインターフェイスも提供しています。[14]

XML形式の場合、タグ、関連するFoundationクラスとCoreFoundationタイプ、およびデータストレージ形式は次のとおりです。

基礎クラス CoreFoundationタイプ XMLタグ ストレージ形式
NSString CFString <文字列> UTF-8でエンコードされた文字列
NSNumber CFNumber <実数>、<整数> 10進文字列; 実数は指数を持つことも、無限大(inf)またはNaN(nan)にすることもできます。
NSNumber CFBoolean <true />、<false /> データなし(タグのみ)
NSDate CFDate <日付> ISO8601形式の文字列
NSData CFData <データ> Base64でエンコードされたデータ
NSArray CFArray <配列> 任意の数の子要素を含めることができます。空にすることができます。
NSDictionary CFDictionary <dict> <key>タグとplist要素タグを交互に。空にすることができます。

バイナリファイル形式は、AppleのFoundationライブラリでのバイナリplistのオープンソース実装用のCore Foundation Cコードソースファイル(CF / CFBinaryPList.c )のコメントブロックに記載されています。[15] Appleは、plist(5)のマニュアルページのドキュメントで実装を不透明であると説明しています[16]。これは、フォーマットへの依存が推奨されていないことを意味します。バイナリファイル形式では、マジックナンバー(有効なplistファイルであることを示すファイルの最初の数バイト)はテキストbplistであり、その後に形式のバージョンを示す2バイトが続きます。

バイナリファイルには、XMLまたはJSONファイル形式ではキャプチャできない情報を格納できます。配列、セット、および辞書のバイナリ型は、ファイル内のオブジェクトテーブルにインデックスを付けるポインタ(objrefおよびkeyrefエントリ)で構成されています。これは、バイナリplistが、たとえば、ファイルにシリアル化された別個の配列とディクショナリの両方に同じデータ要素が格納されているという事実をキャプチャできることを意味します。これをXMLファイルに取り込むことはできません。このようなバイナリファイルを変換すると、データ要素のコピーがXMLファイルに配置されます。さらに、バイナリファイルには、シリアル化されたときにデータ項目を識別するために使用されるUIDタイプがあります。Cコードソースファイルから取得して保存できるデータの完全なリストは次のとおりです。

バイナリplistオブジェクト形式(CoreFoundation 1153以降)[15]
基礎クラス CoreFoundationタイプ オブジェクトタイプ マーカーバイト エンコードされたデータ
nil nil null(v "1" +) 0000 0000 該当なし
NSNumber CFBoolean ブール 0000 1000(false)
0000 1001(true)
該当なし
NSURL CFURL url(v "1?" +) 0000 1100(ベース文字列)
0000 1101(文字列)
string:再帰エンコーディングのURL文字列(「文字列オブジェクト形式?」のように)。基本文字列:同じですが、最初にエンコードされた基本URLを使用します。
NSUUID CFUUID uuid(v "1?" +) 0000 1110 16バイトのUUID
塗りつぶし 0000 1111 何も-ただのパディング
NSNumber CFNumber int 0001 nnnn バイト数は2 ^ nnnn、ビッグエンディアンバイト(1、2、4、または8)
NSNumber CFNumber 本物 0010 nnnn バイト数は2 ^ nnnn、ビッグエンディアンバイト(4または8)
NSDate CFDate 日にち 0011 0011 8バイトのfloatが続き、ビッグエンディアンバイト。2001年1月1日からの秒数(コアデータエポック)
NSData CFData データ 0100 nnnn [int] nnnnはバイト数です。ただし、1111の場合は、int countが続き、その後にバイトが続きます。
NSString CFString ストリング 0101 nnnn [int] ASCII文字列、nnnnは文字数、それ以外の場合は1111、int count、bytes
NSString CFString ストリング 0110 nnnn [int] Unicode文字列、nnnnは文字数、それ以外の場合は1111、次にintカウント、次にビッグエンディアンの2バイトuint16_t
NSString CFString 文字列(v "1" +) 0111 nnnn [int] UTF-8文字列、nnnnは文字数、それ以外の場合は1111、int count、bytes
UID 1000 nnnn nnnn + 1は、ビッグエンディアンバイト(1、2、4、または8)の数です。Unsigned int、NSKeyedArchiverによってのみ生成されます(以下を参照)。[17]
NSArray CFArray 配列 1010 nnnn [int] objref * nnnnはカウントです。ただし、「1111」の場合を除き、intカウントが続きます。
NSOrderedSet ordset(v "1" +) 1011 nnnn [int] objref * nnnnはカウントです。ただし、「1111」の場合を除き、intカウントが続きます。
NSSet CFSet セット(v "1?" +) 1100 nnnn [int] objref * nnnnはカウントです。ただし、「1111」の場合を除き、intカウントが続きます。
NSDictionary CFDictionary dict 1101 nnnn [int] keyref * objref * nnnnはカウントです。ただし、「1111」の場合を除き、intカウントは次のようになります。

多くのタイプv "1?" +ノートに注意してください。これは、マーカーバイトが「1?」以上のフォーマットバージョンのファイルでのみ検出されることを意味します。マジックナンバー。CFBinaryPlist実装はバージョン「0?」のみを処理するため、それらを解析する正確な方法は、レガシー型を解析する方法よりも曖昧です。NSKeyedArchiverはすでにこれらの情報をキャプチャできるため、実際には、これらのタイプに遭遇することはありません。

オフセットのテーブルがオブジェクトテーブルの後に続き、その後に2つのテーブルのサイズと場所に関する情報を含むトレーラーが続きます。

plistへのシリアル化

プロパティリストは、任意のオブジェクトを記述するために必要なすべての情報とデータ型をキャプチャするわけではないため、エンコードとデコードの追加レイヤーが行われることがよくあります。OpenStep仕様は、 NSCodingプロトコルの下でNSObjectをシリアル化する操作を抽象化します。このプロトコルを実装するクラスは、NSCoderサブクラスによってインスタンスを他の形式にシリアル化できます。[18]オブジェクトをplistにシリアル化する目的で、2つの主要なコーダーが存在します。

  • NSArchiverは、オブジェクトをタグ付き構造体のようなバイナリデータのブロックに変換します。このクラスはOpenStepの一部ですが、具体的な形式は定義されていません。実際には、これを使用してオブジェクトをファイルにシリアル化する(plistをスキップする)か、データをplistに埋め込むことができます。書き込みと同じ順序で読み書きする必要があります。NSKeyedArchiverの導入により、その使用は廃止されます。
  • Mac OS X 10.2で導入されたNSKeyedArchiverは、オブジェクトをNSDictionaryに変換しますプログラマーにとってのこの形式の主な改善点は、固定された順序ではなく、文字列キーによってメンバーにアクセスすることです。内部的には、 $ objectsと呼ばれるオブジェクトテーブル配列をディクショナリに格納することにより、バイナリplist形式をいくらか要約します。クラス情報を含む他のすべては、UIDポインターによって参照されます。dictの下の$ topエントリは、プログラマーがエンコードしようとしていた最上位のオブジェクトを指します。[17]

特に、アーカイバを使用すると、plist形式自体を変更せずに新しいデータ型をエンコードできます。これは、AppleがNSSetやnull値などをエンコードするための推奨される方法です。一部のクラスではplistがサポートすることになっている場合でも、もう1つのレイヤーをたどる必要があるため、フォーマットの解析は少し難しいことがわかります。オブジェクトテーブルもあるバイナリ形式と同様に、NSKeyedArchiverで循環参照を作成することができます。XMLにはUIDデータ型がないため、整数は「CF $ UID」キーの下で辞書に保存されます。[19]

AppleはSwiftCorelibsFoundationでオープンソースのNSKeyedArchiverを公開しています。クローズドソースのAppleFoundationと同様に、出力形式をバイナリとXMLのみに制限します。また、シリアル化の結果を示すいくつかのテストケースもあります。[20] GNUstepには互換性のある実装もあり、出力フォーマットを制限しません。[21]

パス言語

XPathがXMLに対して行うような、プロパティリスト用の単一の標準化されたパス言語はありませんが、さまざまなプログラムで使用される非公式の規則が存在します。

  • ドット構文バージョンは、Appleのplutilのkeypath引数にあります。から派生しているようです。[12](id) -[NSObject(NSKeyValueCoding) valueForKeyPath:]
  • PlistBuddyは、インデックス作成用のコロン構文を使用して、別の形式を使用します。[11]

どちらの形式でも、区切り文字を含むキーを表現することはできません。

その他のプラットフォーム

Windows

iOSやmacOSを含むAppleまたはDarwinシステムで最もよく知られていますが、iTunes [22]やSafari [23]などのAppleソフトウェアがインストールされている場合、plistファイルはWindowsコンピュータにも存在します。Windowsでは、ファイルは通常バイナリファイルですが[24]、一部のアプリケーションは他の形式のPLISTファイルを生成する場合があります。

Windowsでは、Apple plistファイルはユーザーのホームディレクトリの%USERPROFILE%\ AppData \ Roaming \ AppleComputerに保存されます。Windows上のこれらのplistファイルは、通常、Windowsレジストリを使用するのではなく、設定やその他の情報を保存します。

WindowsでPLISTファイルを編集するためのオプションは、macOSほど広範囲ではありません。ファイルが注意してXMLまたはJSON形式である場合は、Notepad ++などのテキストエディタを使用できます。Appleはplutil.exeを「AppleApplicationSupport」パッケージ(iTunesの一部)に同梱しており、対応するmacOSと同じです。

NetBSD

2006年に導入され、NetBSD#4.0(2007)で最初にリリースされたのはproplibライブラリであり、カーネルとユーザーランドの間でデータをシリアル化するために使用できます。XMLplist言語の一部を実装します。[25]

proplibのサンプルユーザーの1つは、システム監視用のsysmonenvsysフレームワークの2番目のリビジョンです

NetBSDのproplibライブラリも2010年にDragonFlyに移植されており、DragonFly BSD#2.8以降で利用可能です。[26]

クロスプラットフォーム

  • FacebookのXcodeビルドツールxcbuildのオープンソースの再実装には、plistライブラリとplutilおよびPlistBuddyが含まれています。これらのクロスプラットフォームユーティリティはC ++で記述されています。[27]
  • Pythonプログラミング言語plistlibには、AppleのXMLまたはバイナリ(Python 3.4以降)でplistファイルを読み書きするための組み込みモジュールがあります[28] ProperTreeは、このライブラリを利用するクロスプラットフォームエディタです。[29]
    • ccl-bplistと呼ばれるサードパーティライブラリには、NSKeyedArchiverUIDを処理する追加機能があります。[19]
  • Goには、plistOpenStepテキスト、GNUStepテキスト、Apple XML、およびAppleBinaryの4種類のplistをサポートするパッケージがあります。また、XMLおよびバイナリ形式のUIDも処理します。[2]

も参照してください

メモ

  1. ^ macOS plの癖は、標準入力を手動で入力して^ Dで終了すると、stdoutに迷子の「D」文字が入ることです。
  2. ^ In Obj-C Foundationは、辞書表現を返すという点でバグがありますオープンソースのSwiftFoundationにはそのような問題はありません。descriptionNSData

参考文献

  1. ^ "NSStringクラス参照:propertyListFromStringsFileFormat"GNUstep 2020年2月17日取得
  2. ^ a b "パッケージplist"godoc.orgUnmarshalがOpenStepプロパティリストに遭遇すると、緩和された解析モードに入ります。OpenStepプロパティリストはプレーンな古いデータのみを文字列として保存できるため、必要に応じて整数、浮動小数点、ブール値、および日付の値を復元しようとします。
  3. ^ 「古いスタイルのASCIIプロパティリスト」Apple Developer(プロパティリストプログラミングガイド)2020年2月16日取得
  4. ^ a b defaults(1)  –Linux 一般コマンドマニュアル
  5. ^ Frith-Macdonald、Richard(2004)。「NSPropertyListSerializationクラスのドキュメント」GNUstep
  6. ^ 「プロパティリスト」GNUstepWiki
  7. ^ 「NSSerializationドキュメント」GNUstep ソースコード
  8. ^ 「タイプと定数:NSPropertyListFormat」gnustep.org
  9. ^ pldes(1)  –Linux 一般コマンドマニュアル
  10. ^ "appleexaminer.com:"PLISTファイル""2014年2月19日にオリジナルからアーカイブされました。 2014年2月27日に取得されました。
  11. ^ a b PlistBuddy(8)  – ダーウィンおよびmacOSシステムマネージャーのマニュアル
  12. ^ a b plutil(1)  – ダーウィンmacOSの一般的なコマンドマニュアル
  13. ^ pl(1)  – ダーウィンmacOSの一般的なコマンドマニュアル
  14. ^ 「AppleScript:プロパティリスト」2009年4月24日。2009年4月24日のオリジナルからアーカイブ
  15. ^ a b "CF /CFBinaryPList.c"Appleオープンソース2020年1月6日取得
  16. ^ plist(5)  – ダーウィンmacOSファイルフォーマットマニュアル
  17. ^ a b ケイスネス、アレックス(2012年4月4日)。「オタクの投稿:NSKeyedArchiverファイル–それらは何で、どのように使用できますか?」デジタル調査リスト2のCF $ UIDデータ型は、単一のキー( "CF $ UID")の後に整数が続く辞書です(このレイアウトは、プロパティリストがXMLで表されている場合に表示されます。バイナリ形式の「UID」データ型は、辞書構造を必要としない別個のエンティティです)。これらのデータ型は、「$ objects」配列内の別のエンティティへの参照を表します。CF $ UIDの番号は、配列の位置を示します。
  18. ^ "NSCoder.html"OpenStep仕様
  19. ^ a b CCLForensics Group(2020年1月15日)。"cclgroupltd / ccl-bplist"GitHub
  20. ^ "apple / swift-corelibs-foundation:NSKeyedArchiver.swift"GitHub2021年12月14日。 テスト
  21. ^ 「NSKeyedArchiverドキュメント」GNUstepドキュメント2020年2月23日取得 ソースコード
  22. ^ 「iTunesバックアップ-iPhoneWiki」www.theiphonewiki.com
  23. ^ 「AppleSafariWebブラウザはどのように設定をWindowsに保存しますか?」スーパーユーザー
  24. ^ 「GitHub-microsoft / NSPlist:NSPlist」2019年5月3日–GitHub経由。
  25. ^ ジェイソンR.ソープ。「proplib—プロパティコンテナオブジェクトライブラリ」NetBSD
  26. ^ ジェイソンR.ソープ。「proplib—プロパティコンテナオブジェクトライブラリ」DragonFlyBSD
  27. ^ "facebook / xcbuild / Libraries / plist"GitHub 2020年2月17日取得
  28. ^ "plistlib — Mac OS X.plistファイルを生成および解析します"Python3のドキュメント2020年1月6日取得
  29. ^ "corpnewt / ProperTree:Pythonで記述されたクロスプラットフォームGUIplistエディター"GitHub2020年2月17日2020年2月17日取得

外部リンク