9

NSDictionary または NSCoder/NSCoding をいつ使用するかを決定する方法を理解しようとしていますか?

一般的なプロパティ リストなどの場合、アプリケーションの外部で簡単に編集できる XML ファイルを生成する NSDictionary が簡単な方法のようです。

データを保持するカスタム クラス、または内部にネストされた他のカスタム クラスを処理する場合、含まれているすべてのオブジェクト クラスをステップスルーし、アーカイブ コマンドを使用するときにそれらをエンコードするため、NSCoder/NSCoding の方が適しているように思われます。

NSDictionary は、NSCoder/NSCoding が NSCoding インターフェースを実装するネストされたカスタム クラスを自動的にエンコードする場合、すべてのプロパティまたはデータ特性を単一のレベルに取得して保存できるようにするには、より多くの作業が必要になるようです。

それがバイナリデータであり、アプリケーションの外部で編集できないこと以外に、一方を他方よりも優先して使用する本当の理由はありますか? そして、これらの線に沿って、2 つの間でどちらに傾くべきかの指標はありますか? 明らかな何かが欠けていますか?

4

4 に答える 4

9

オブジェクト グラフに関する Apple のドキュメントには、次のように書かれています。

Mac OS X のシリアル化では、辞書、配列、文​​字列、バイナリ データなどの値オブジェクトの単純な階層が格納されます。シリアル化では、オブジェクトの値と階層内での位置のみが保持されます。同じ値のオブジェクトへの複数の参照は、逆シリアル化されたときに複数のオブジェクトになる可能性があります。オブジェクトの可変性は維持されません。

…</p>

Mac OS X のアーカイブには、任意の複雑なオブジェクト グラフが保存されます。アーカイブは、グラフ内のすべてのオブジェクトの ID と、グラフ内の他のすべてのオブジェクトとのすべての関係を保持します。アーカイブを解除すると、再構築されたオブジェクト グラフは、いくつかの例外を除いて、元のオブジェクト グラフの正確なコピーになります。

私がこれを解釈する方法は、単純な値を保存したい場合は、シリアル化 (たとえば、NSDictionary を使用) が良い方法であるということです。一意性と可変性を維持したまま、任意の型のオブジェクト グラフを格納する場合は、アーカイブを使用する (たとえば、NSCoder を使用する) のが最善の策です。

Apple のArchives and Serializations Programming Guide for Cocoaも読みたいかもしれません。オブジェクト グラフに関する前述のページは、このトピックをよくカバーしているため、その一部です。

于 2008-09-29T15:27:49.897 に答える
5

私はNSCoding/NSCoder / NSArchiver(名前を選択する必要があります!)を使用してオブジェクトグラフをファイルにシリアル化するのが好きではありません。

この方法で作成されたアーカイブは非常に壊れやすいものです。クラスFooのオブジェクトを保存する場合は、データをロードするときに、アプリケーションにクラスFooがあることを確認する必要があります。

これにより、NSCoderベースのシリアル化は、他のアプリケーションとファイルを共有するという観点から、または将来のアプリケーションとの互換性を転送するという観点から困難になります。

于 2008-09-29T17:53:24.993 に答える
2

おすすめを書き忘れていました。

NSCoding は、特定の状況では問題ない場合があります。すばやく簡単なことを行う場合 (ただし、多くのコードを記述する必要があります。クラスごとに 2 つのメソッドをシリアル化する必要があります)。他のアプリとの相性を気にしなければOKです。

プロパティ リストを介したエクスポート/インポート (おそらく NSPropertyListSerializaion クラスを使用) は優れたソリューションです。XML ベースの plist は、簡単に作成および編集できます。plists の主な利点は、ファイル形式をアプリケーションだけに結び付けないことです。

また、独自の XML ベースのファイル形式を作成し、NSXMLDocument API とその仲間を使用して読み書きすることもできます。これは、実際にはプロパティ リストを使用するよりもはるかに手間がかかりません。

于 2008-09-29T18:40:15.580 に答える
1

少し混乱していると思います.NSDictionaryはデータ構造であり、たまたまNSCodingプロトコルを実装しています. したがって、本質的には、すべてのデータを NSDictionary に入れて後でエンコードするか、NSCoding プロトコルを実装して NSCoder API を使用してオブジェクト ツリーをエンコードすることができます。encodeWithCoder: メソッドに渡された NSCoder オブジェクトのタイプに基づいて、エンコーディングの出力です。

于 2008-09-29T15:27:01.583 に答える