2013-06-17 10 views
7

CLR Via C#は、バイナリシリアル化を使用してオブジェクトを簡単に複製する方法を示しています。そのようなBinaryFormatterを作成するときにそれはStreamingContextStates.Clone指定StreamingContextStates.Cloneは実際に何をしていますか?

var formatter = new BinaryFormatter 
{ 
    Context = new StreamingContext(StreamingContextStates.Clone) 
}; 

The documentation for StreamingContextStates.Clone

は、オブジェクトグラフがクローニングされていることを指定することを言います。ユーザーは、同じプロセス内でクローングラフが引き続き存在し、ハンドルや管理されていないリソースへの参照に安全にアクセスできると想定できます。

十分に公正ですが、実際にはどういう意味なのか分かりません。どのようにして実際にはBinaryFormatterの動作が変わりますか?誰でもこの旗を使用している具体的な効果を列挙できますか?

+3

、私は**強く**あなたも、ほとんどの状況で 'BinaryFormatter'を避けることを示唆しています。それは便利なところがいくつかありますが、私は*たくさんの*人がこれに起因する痛みをたくさん持っているのを見ました...実際に、BinaryFormatterの問題は私がシリアライゼーションに深く関わっている理由の一部です数年前 –

+3

このプロパティは 'ISerializable.GetObjectData(...)'に再公開されています。したがって、技術的には**どの実装も理論的には 'StreamingContextStates'値に基づいて異なる処理をすることができます。しかし、もしあれば、どれくらいの数があるのか​​分かりません。 –

+0

@MarcGravell興味深いことに、ありがとう。 (そしておそらく、そのサンプルは次回の版ではC#経由でCLRから取り出されるべきです;) –

答えて

2

ここではシリアル化が対象です。
MSはオブジェクトの直列化を可能にするための「抽象的な」ミニフレームワークを提供しました。
バイナリフォーマッタは、そのミニフレームワークのコンセプトの特定の実装です。

開発者は、独自のカスタムフォーマッタを作成するために、そのフレームワークの概念を使用することを選択することができます。
MS自体は、シリアル化のさらなる実装を考えたミニフレームワークを作成するときに使用します。

そこで、これらのフラグをフレームワークの一部として提供しました。

これらのフラグは、オブジェクトグラフを追跡し、単純に生データのバイトに変換するためのツール(必要に応じて)として既に実装されているため、バイナリフォーマッタには影響しません。
データベースやファイル、共有メモリなどにオブジェクトを保存できる独自のシリアライザを作成する場合は、シリアライザを使用するユーザが対応するフラグを指定する必要があります。

は、私は完全に2003年以来、MSの開発者を誤解しない限り.. :)(可能である!)レコードの

関連する問題