MacOSプログラミング/Cocoaでのアーカイブとシリアライズ機能 概要編

今作っているアプリで、ファイルフォーマットをアレコレ考えるのが面倒なのでCocoaの機能でやろうと思いArchives/Serializationを調べています。
最近は、この手のドキュメントを読む際には必ずOmni Outlinerで自分向けに簡易マトメを作っているのですが、それを実験的に公開してみます。

元ネタ:
Archives and Serializations Programming Guide for Cocoa

まずは、Object Graphについての説明。このページがちょうど、各種技術の概要になっている。

オブジェクトグラフって何?
- オブジェクト指向のアプリケーションは、オブジェクト同士の複雑な関係性を内包している。
イメージ的にはこんな感じ。

(画像はADCから直に引用してます)

- オブジェクトグラフとは、このオブジェクト同士の相互関連性のことである
- 少ないオブジェクトによるグラフであっても、循環参照や、単一のオブジェクトに対して複数のオブジェクトが参照したりする関係は発生する場合がある。要するに、アプリケーションとして使いやすい形にすると、しばしばファイルやらデータストリームに落とし込むのにはやっかいな形になる。
- このオブジェクトグラフ(通常はその一部だけ)を、ファイルや何か別の形式に変換して、保存したり、別のプロセスや別のPCに送信したいと思うときがある。この処理を手伝ってくれるのが、ArchiveやSerializeといった機能である。
- OSXがオブジェクトグラフをファイルに保存するために、元々用意している仕組みがある。NibファイルとProperty Listの2つである。
- Nibは(UIに関連する)オブジェクトの複雑な関係性を保存する。
- PropertyListはもう少し単純なオブジェクトの関係性と、値を保存する。

アーカイブ(Archives)って何?
- OSXのアーカイブは複雑なオブジェクトグラフを保持する。アーカイブはオブジェクト一つ一つをちゃんと別個のものとして扱い、オブジェクト同士の関連性を保存する。
- 展開されたオブジェクト群は、いくつかの例外はあるが、大体アーカイブされた時の元のオブジェクトグラフの完全なコピーとなる。
- Interface Builderはnibファイルというアーカイブを使用してオブジェクトやその関係性を保存する。
- あなたのアプリケーションは、アーカイブ機能を使うことによって、独自のファイルフォーマットを作成することなしに、独自の情報をオブジェクトグラフの形でファイルの保存することが出来る
- アーカイブをサポートするためには、オブジェクトは必ずNSCodingプロトコルを実装しなければならない。
- ほとんどのFoundationの値系のオブジェクトと、AppkitのオブジェクトはNSCodingを実装しているので、アーカイバーにそのまま放り込むことが出来る

シリアライゼーション(Serialization)って何?
- OSXのシリアライゼーションとは、単純なヒエラルキーの値オブジェクト、たとえば辞書、配列、文字列、バイナリデータを保持するための仕組みである。
- シリアライゼーションは、オブジェクトの値と、ヒエラルキー上におけるその位置(順番)のみを保持する。
- 一つのオブジェクトに対する複数の参照は、シリアライズされたときには複数の別のオブジェクトとして保存される場合がある。つまり、デシリアライズされると、同じ値をもつ別のオブジェクトになる可能性がある。
- Property Listはシリアライゼーションの一例で、アプリケーション属性やユーザープレファレンスを保存する目的で使用されている。
- OSXのシリアライゼーションでは、任意のオブジェクトをシリアライズすることは出来ない。NSArray, NSDictionary, NSString, NSDate,NSNumber,NSDataのみがシリアライズ可能である。NSArrayやNSDictionaryのコンテンツは、同じくこれらのクラスのインスタンスでなければならない。

NOTE: 
OSX10.1以前では、Cocoaはこれらのクラス以外へのシリアライズの機能を持っていたが、deprecatedにされた。それに向けたドキュメントもあるが、主に下位互換性を維持するためのもので、今から作るアプリケーションについて使うべき機能ではない。


まとめ
- OSXにおけるオブジェクトグラフとは、関係性を持ったオブジェクト群の事。
- オブジェクトグラフを保存したり展開したりするには、Archive/Unarchiveの仕組みを使用する。
- Serializationの仕組みは、プロパティリストに保存可能な程度の内容を扱いたい時に限定する。また、自前の型をシリアライズすることは出来ないと心得る。

概要の時点での注意点としては、いわゆる一般に言われるシリアライズ機能というのは、OSXの世界においてはArchiveが担っていて、Serializationの機能は別物であるということくらいだろうか。

Comment

管理者だけに表示を許可する

Trackback

Trackback URL:

http://deathcube.blog36.fc2.com/tb.php/16-88647b5c