BinaryFormatterによるDeep Copyと明示的実装の違い

お手軽にDeep Copyを実現するなら、BinaryFormatterが使われることがあるが、かなり処理時間がかかるため、速度を重視するなら明示的にDeep Copyを実装する必要がある。ぶら下がっている型全てで明示的に実装する必要はあるが、大抵は特に問題なく実装できるだろう。しかし、BinaryFormatterによるDeep Copyと、典型的な明示的実装には一部大きな違いがある。

下図の構造のインスタンスがあったとする。BinaryFormatterによるDeep Copyでは、オブジェクトグラフを完全に複製する。一方で、典型的な明示的実装ではツリー構造に変化してしまう。これは明示的実装でなくとも、XMLJSONなどへ単にシリアライズ・デシリアライズすることでDeep Copyした場合も同じだ。

元の構造を維持したい場合、それなりに工夫する必要がある。

例えば、そのオブジェクトグラフにおいて各インスタンスのIdが必ずユニークであるという前提があるならそれを利用して、一度コピーしたIdのインスタンスは再度コピーしないようにキャッシュすればよい。連鎖的なコピーの最初にキャッシュを作って持ちまわる。