自分で作成したのではないオブジェクトをメモリに複製する必要があります。オブジェクトはタグ付けされていないため、インターフェイスICloneable
またはSerializable
シリアライゼーションによるディープ クローンは機能しません。このオブジェクトをディープクローンする方法はありますか? 安全ではない win32 API 呼び出しでしょうか?
3 に答える
参考までに、 としてマークされたインターフェイスは、ICloneable
必ずしもディープ コピーされているわけではありません。実装するのは実装者次第でICloneable
あり、それらが複製されるという保証はありません。
オブジェクトが実装されていないとおっしゃっていますISerializable
が、Serializable
属性はありますか?
バイナリ シリアライゼーションによるディープ コピーの作成は、3 ~ 5 行のコードで複雑なグラフを複製できるため、おそらく私が知っている最も簡単な方法の 1 つです。別のオプションはXmlSerializer
、オブジェクトが可能な場合ですXmlSerialized
(シリアル化の属性を指定したり、インターフェイスを実装したりしませんがIDictionary
、ホースされたインターフェイスがある場合.
それ以外は本当に何も考えられません。すべてのデータが公開されている場合は、独自のクローン作成ルーチンを実行できます。そうでない場合でも、リフレクションを使用してクローンを作成し、プライベート データを設定できます。
「深い」というのはトリッキーなビットです。浅いコピーの場合、リフレクションを使用してフィールドをコピーできます (読み取り専用であると仮定すると、これは大きな仮定です)。しかし、これを (自動的に) 機能させるのは非常に困難です。
もう1つのオプションは、シリアライザーを自分で提供する(そしてシリアライズしてディープクローンにする)ことです-「シリアライゼーションサロゲート」。VBの例を次に示します。
これを行う唯一の方法は、オブジェクトとそのすべてのメンバー (それ自体がメンバーを持つ他のオブジェクトなど) を分離するために真剣に検討することだと思います。これはフレームワーク シリアライザーが行うことですが、適切にマークされたものに対してのみ行います。
Mono.Cecil のような産業グレードのリフレクション ライブラリに役立つものがあるかどうかはわかりません。
堅牢な汎用ソリューション (たとえば、静的メンバーを適切に処理するのは難しい場合があります) を思いついたとは思いませんが、特定のケースで何かを機能させることができるかもしれません。