iOS ドキュメントでは、「シリアル化」と「アーカイブ」を区別しています。これは一般的な違いですか (つまり、他の言語にも当てはまります)、それとも Objective-C に固有のものですか? また、これら2つの違いは何ですか?
3 に答える
私は実際にIOSの観点からそれらの違いを探そうとしていました。興味のある人のために以下を追加します:
目的:
アーカイブは、オブジェクトグラフを保存するために使用されます。完全なデータモデルは、簡単にアーカイブおよび復元できます。Nibファイルの動作は、アーカイブの例と見なすことができます。
シリアル化は、オブジェクトの任意の階層を格納するために使用されます。
wat plistファイルの動作は、シリアル化の例と見なすことができます。
相違点(アーカイブプログラミングガイドからの抜粋):
「アーカイブは、グラフ内のすべてのオブジェクトのIDと、グラフ内の他のすべてのオブジェクトとのすべての関係を保持します。」
rootObject呼び出しのコンテキスト内でエンコードされたすべてのオブジェクトが追跡されます。コーダーがオブジェクトを複数回エンコードするように求められた場合、コーダーは、オブジェクトを再度エンコードするのではなく、最初のエンコードへの参照をエンコードします。
「シリアル化では、オブジェクトの値と階層内の位置のみが保持されます。同じ値オブジェクトへの複数の参照は、逆シリアル化されたときに複数のオブジェクトになる可能性があります。オブジェクトの可変性は維持されません。」
実装の違い:
NSCodingプロトコルを実装するオブジェクトはアーカイブできますが、NSArray、NSDictionary、NSString、NSDate、NSNumber、NSData(およびそれらのサブクラスの一部)のインスタンスのみをシリアル化できます。配列オブジェクトとディクショナリオブジェクトのコンテンツにも、これらのいくつかのクラスのオブジェクトのみが含まれている必要があります。
使用する場合:
プロパティリスト(シリアル化)は、主に文字列と数値で構成されるデータに使用する必要があります。バイナリデータの大きなブロックで使用すると、非常に非効率的です。
plistオブジェクト以外のオブジェクトをアーカイブしたり、データの大きなブロックを保存したりすることは価値があります。
これは、(すべてではありませんが) 時々、一方が他方になる場合です。
ウィキペディアでは、シリアル化について次のように述べています。
「シリアライゼーションとは、データ構造またはオブジェクトを一連のビットに変換して、ファイルまたはメモリ バッファーに格納したり、ネットワーク接続リンクを介して送信したりして、後で同じコンピューター環境または別のコンピューター環境で「復活」させるプロセスです。 "
したがって、アーカイブはシリアル化のみの場合もありますが、たとえば、シリアル化と圧縮の組み合わせの場合もあります。あるいは、ある種のヘッダー情報を追加するかもしれません。したがって、シリアライゼーションはアーカイブの形式ですが、アーカイブは必ずしもシリアライゼーションではありません。
これは iOS に固有のものではありません。これらの用語はいたるところに散らばっています。ただし、iOS のコンテキストでの特定の意味は、非常に具体的である可能性があります。
一般的に、シリアル化は、プログラムのデータ型をアーキテクチャに依存しないバイトストリームに変換することに関係しています。アーカイブは特殊なシリアル化であり、タイプやその他の関係ベースの情報を保存して、簡単にシリアル化解除/非マーシャリングできるようにすることができます。したがって、アーカイブは、シリアル化の特殊化およびサブセットと考えることができます。Objective-Cの場合
シリアル化は、Objective-Cタイプをアーキテクチャに依存しないバイトストリームとの間で変換します。アーカイブとは対照的に、基本的なシリアル化では、値のデータ型や値間の関係は記録されません。値自体のみが記録されます。データを適切な順序で逆シリアル化するのはユーザーの責任です。ただし、いくつかの便利なクラスは、プロパティリストをシリアル化し、その構造を値とともに記録する機能を提供します。
C++ブーストシリアル化を使用-
http://www.boost.org/doc/libs/1_45_0/libs/serialization/doc/index.html
ここでは、「シリアル化」という用語を使用して、C++データ構造の任意のセットをバイトシーケンスに可逆的に分解することを意味します。このようなシステムは、別のプログラムコンテキストで同等の構造を再構成するために使用できます。コンテキストに応じて、これはオブジェクトの永続性、リモートパラメータの受け渡し、またはその他の機能の実装に使用される場合があります。このシステムでは、「アーカイブ」という用語を使用して、このバイトストリームの特定のレンダリングを指します。これは、バイナリデータ、テキストデータ、XML、またはこのライブラリのユーザーによって作成されたその他のファイルである可能性があります。