プロパティリスト(property list)は、macOSのCocoaフレームワークや、NeXTSTEP、GNUstepといった環境で利用される、オブジェクトの
シリアライズ(データ構造を変換し、保存・転送可能な形式にすること)を行うためのファイル形式です。
拡張子`.plist`を持つことから、plistファイルとも呼ばれます。
プロパティリストの概要
プロパティリストは、`NSPropertyListSerialization`クラスによって解析されます。この形式が扱えるデータは、Foundationや
Core Foundationのオブジェクトに限られます。プロパティリストの最上位は、
配列(`NSArray`)または連想
配列(`NSDictionary`)である必要があります。
主な用途としては、ユーザー設定の保存が挙げられます。これは、Windowsにおける
レジストリに似た役割を果たします。また、アプリケーションの
バンドル情報(アプリの構成要素や設定情報など)を格納するためにも利用されます。以前のMac OSでは、リソースフォークという仕組みが同様の目的に使われていました。
表現形式
プロパティリストが表現するデータ自体は抽象的な概念であり、永続化のための
ファイルフォーマットは固定されていません。NeXTSTEP時代には特定のフォーマットが使用されていましたが、その後GNUstepやmacOSで異なるフォーマットが採用されるようになりました。
NeXTSTEPのプロパティリスト
NeXTSTEPでは、プロパティリストは可読性を重視したフォーマットとして設計されました。人間が直接編集することも想定され、
プログラミング言語のような構文を持つASCIIテキスト形式で記述されました。
- - 文字列(`NSString`)は、`"This is a plist string"`のように表現されます。
- - バイナリデータ(`NSData`)は、`< 54637374 696D67 >`のように16進数で表現されます。
- - 配列は、`("one", "two", "three")`のように表現されます。
- - 連想配列は、
{
"key" = "value";
...
}
のように表現されます。
ただし、この初期のプロパティリストには制約があり、`NSValue`(数値、真偽値など)のオブジェクトを直接表現できませんでした。
GNUstepのプロパティリスト
GNUstepはNeXTSTEPのフォーマットをベースにしつつ、いくつかの拡張を加えました。
- - `NSValue`がサポートされ、`<INNN>`(NNNは数値)のように表現されるようになりました。
- - `NSDate`(時刻)もサポートされ、`<DYYYY-MM-DD HH:MM:SS timezone>`のように表現されます。
GNUstepは、後述するmacOSのフォーマットも読み書きできます。
GNUstepに付属のツール`plget`を使うと、プロパティリスト内の階層化されたキーに対応する値を取得できます。例えば、
bash
$ cat com.example.app.plist | plget key
$ cat com.example.app.plist | plget key | plget key
のように利用します。
macOSのプロパティリスト
macOSはNeXTSTEPのフォーマットも扱うことができますが、
Appleは新たに2つのフォーマットを開発しました。
Mac OS X 10.0では、NeXTSTEPのフォーマットは非推奨となり、
Appleが定義したDTDを持つ新しいXMLフォーマットが導入されました。しかし、XML形式はファイルサイズが大きくなる傾向があったため、Mac OS X 10.2で
バイナリフォーマットが新たに導入されました。Mac OS X 10.4以降では、
バイナリフォーマットがデフォルトとなっています。
macOSでは、`plutil`というユーティリティを利用することで、プロパティリストの文法チェックや、異なるフォーマット間の変換が可能です。
macOSのXMLフォーマットでは、以下のようなタグが使用され、それぞれFoundationのクラスに対応します。ルート要素は`
`です。GNUstepのフォーマットとは多少の違いがあります。
`dict`要素の中身は、
xml
key
value
のように記述されます。
まとめ
プロパティリストは、macOSやその関連環境で広く利用されているデータ保存形式です。異なるフォーマットが存在しますが、それぞれに特徴があり、用途に応じて使い分けられます。ユーザー設定の保存からアプリケーションの設定情報まで、幅広い用途で活用されており、macOS環境において重要な役割を担っています。
参考情報