プロパティリスト(Property List)は永續化(シリアライズ)の爲の手段である。Windows ユーザでも iTunes ライブラリを展開したものは、ここを覗く人なら居るかも知れない。嚴密にはプログラミング言語ではないが、Cocoa ではあまりにも重要なので扱ふことにする。
以上の物とそのサブクラスが對稱となる。以外はプロパティリストとして保存できない。またコレクションクラス(配列と辭書)の場合は格納するオブジェクトもこの基準に沿はねばならない。
この形式の利點は人がみて讀みやすい所にある。ただし、古い形式であるため NSDate は NSStringとの區別がつかなくなる。
クラス | 値 | 記法 | 備考 |
NSString | string | "string" | 値が英數字及び「_」のみの時はダブルクオート無し。一部エスケープされる |
NSNumber | YES(bool) | 1 | ---- |
NSNumber | NO(bool) | 0 | ---- |
NSNumber | 20(int) | 20 | ---- |
NSNumber | 2.0(float) | 2.0 | ---- |
NSDate | @referencetime | "YYYY-MM-DD HH:mm:ss ±XXXX" | ISO に基づくが、これは恐らく description の値 |
NSData | 0xAD238FE8321..... | <10101101 00100011 0011.....> | バイナリは二進數に變換され、8bit=1byte ごとに半角スペースが入る |
NSArray | [obj,obj,.....,obj] | (<obj>, <obj>, ...., <obj>) | <obj>の記法は各々のクラス依存 |
NSDictionary | [key=>obj,key=>obj] | {<key>=<obj>; <key>=<obj>; } | <obj>の記法は各々のクラス依存で、<key>はNSStringに同じ |
Unicode のバイナリ値がそのまま出力される。やうは UTF-16 で出力する。「あ」は2ビットコードであり「U+3042」である。これは「\U3042」と出力される。改行コードは LF は「\n」に置換されるが、CR はそのままである。タブは「\t」に変換され、ダブルクオートもまた「\"」となる。バックスラッシュは重ねることになる。嚴密には、2ビット以上のUnicodeであるとバイナリ値へエスケープされるらしい。
文字 | エスケープ | 備考 |
a | a | 値が英數字及び「_」のみの時はダブルクオートが無く、また左記に同じ。ASCIIの他は次のやうになる |
あ | \U3042 | Unicode は U+3042 |
タブ | \t | ---- |
改行(LF) | \n | ---- |
改行・復歸(CR) | (そのまま) | ---- |
ダブルクオート(") | \" | ---- |
バックスラッシュ(\) | \\ | ---- |
コレクションはその文字數を一列に並べた時に78バイトを超過すれば、アイテムごとに改行することになる。
{ "Application Version" = "8.0.1"; Features = 5; "Library Persistent ID" = XXXXXXXXXXXXXXXX; "Major Version" = 1; "Minor Version" = 1; "Music Folder" = "/Users/XXX/Music/iTunes/iTunes%20Music/"; Playlists = ( { ..... }, ....... ); }
セミコロン(;)及びコロン(,)は必ず半角スペースを一つ後置する。これはダブルクオートで括らない場合への對處。コレクションの要素がこれらで區切られぬ場合、パーサはエラーを發する。なほ NSArray の最後の項目にはコロンが無いのが標準だが、うつかり附けてもきつちり認識される。
コメントは次の三つの形式を許可する。
お馴染みであらう。前者二項は改行、後者一項は「/*」で始まり「*/」で終はるまでがコメントと看做される。
strings は Localizable.strings など、NSBundle クラス等で取得しローカライズ辭書で使用される、UTF-16 でエンコーディングされた書類である。これのためにパーサは NSDictionary がルートである時に限り、ルート要素の NSDictionary には鍵括弧を必要としない。
よつて先程示した ASCII の plist は次のやうでも同樣に解釋されることになる。
"Application Version" = "8.0.1"; Features = 5; "Library Persistent ID" = XXXXXXXXXXXXXXXX; "Major Version" = 1; "Minor Version" = 1; "Music Folder" = "/Users/XXX/Music/iTunes/iTunes%20Music/"; Playlists = ( { ..... }, /* これは註釋 */ ....... ); # これも註釋 // これもさうである
Localized.strings では普通使はないけれど、他の NSArray などのコレクションをこれは要素として持つ事ができる。
あまりこれといつた面白みがない。まづ手始めに DTD があるのでそれをみてみよう。/System/Library/DTDs/PropertyList-1.0.dtd にインストールされてゐる。http://www.apple.com/DTDs/PropertyList-1.0.dtd からも參照できる。
<!ENTITY % plistObject "(array | data | date | dict | real | integer | string | true | false )" > <!ELEMENT plist %plistObject;> <!ATTLIST plist version CDATA "1.0" > <!-- Collections --> <!ELEMENT array (%plistObject;)*> <!ELEMENT dict (key, %plistObject;)*> <!ELEMENT key (#PCDATA)> <!--- Primitive types --> <!ELEMENT string (#PCDATA)> <!ELEMENT data (#PCDATA)> <!-- Contents interpreted as Base-64 encoded --> <!ELEMENT date (#PCDATA)> <!-- Contents should conform to a subset of ISO 8601 (in particular, YYYY '-' MM '-' DD 'T' HH ':' MM ':' SS 'Z'. Smaller units may be omitted with a loss of precision) --> <!-- Numerical primitives --> <!ELEMENT true EMPTY> <!-- Boolean constant true --> <!ELEMENT false EMPTY> <!-- Boolean constant false --> <!ELEMENT real (#PCDATA)> <!-- Contents should represent a floating point number matching ("+" | "-")? d+ ("."d*)? ("E" ("+" | "-") d+)? where d is a digit 0-9. --> <!ELEMENT integer (#PCDATA)> <!-- Contents should represent a (possibly signed) integer number in base 10 -->
この DTD の素晴らしい點はこれをみれば Foundation の六つのクラスに必要なことと役割がある程度わかることである。
エレメント | 對應クラス | 値 | 屬性 | 備考 |
plist | ---- | エンティティ plistObject を一つ | version | 屬性は version="1.0" のみ許容 |
array | NSArray | エンティティ plistObject を0個以上 | ---- | ---- |
dict | NSArray | エレメント key とその次にエンティティ plistObject 、この組を0個以上 | ---- | ---- |
key | ---- | 文字列 | ---- | 強いて言へば對應クラスは NSString |
string | NSString | 文字列 | ---- | ---- |
data | NSData | 文字列 | ---- | ただし書きには Base64 encode濟 であるとある |
date | NSDate | 文字列 | ---- | ISO 8601 に基づく |
true | NSNumber | ---- | ---- | 値を取てはならない |
false | NSNumber | ---- | ---- | 値を取てはならない |
real | NSNumber | 文字列 | ---- | ただし書き正規表現に從ふ文字列 |
integer | NSNumber | 文字列 | ---- | 10進數のみ |
エンティティ plistObject は plist タグと key タグを除く全てになる。普通はしない DTD を定義したのは可視性の向上などにあると思はれる。この單純な(けれど冗長な)コーディングによつて、プログラマは xml を開いてみただけで何がシリアライズされてゐるのか把握することができるのである。
NSData のバイナリデータを Base64 でシリアライズするといふことは、それなりに厖大な長さになることが容易に想像できるかと思ふ。68文字(68バイト)で折疊むのが標準の模樣
ASCII 形式ほどに編輯頻度は高くない。XML 形式のコメントが當然使へる。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Application Version</key><string>8.0.1</string> <key>Library Persistent ID</key><string>XXXXXXXXXXXXXXXX</string> <key>Major Version</key><integer>1</integer> <key>Minor Version</key><integer>1</integer> <key>Music Folder</key><string>/Users/XXX/Music/iTunes/iTunes%20Music/</string> <key>Playlists</key> <array> <dict> ........ </dict> <dict> . . </dict> </array> </dict> </plist>
ASCII の Property List と同じ内容とした。dict、array はこのやうに改行することが多いが、data も68文字を越えて改行するとこのやうになる。
<array> <data> AQEAAw................ ... ... AAAAAAAAAAAA== <data> <array>
一部調査中。「bplist00」で始まるバイナリファイル。パフォーマンス向上の爲に考案された。
そんなものはない。素人に編輯はできない。