DataContractSerializer を使ってディープコピー
.NET でオブジェクトをディープコピーする方法探してたら、実にエクセレントな記事を見つけました。
ただし速度的に気になったので BinaryFormatter で調べていたら、neue.cc さんのブログにこんな記事が!
どうやら DataContractSerializer の方が性能が良さ気です。シリアライズ時のサイズは大きくなりますが、よほど巨大なオブジェクトじゃない限りサイズを気にする必要はなさそうです。
また、同じく neue.cc さんの記事
によれば、DataContractSerializer はいまや .NET の標準的なシリアライザーとのこと。
で、ディープコピーメソッド(DataContractSerializer 版) を書いてみました。
ちなみに参照設定には System.Runtime.Serialization が必要です。
''' <summary> ''' オブジェクトのディープコピーを行います。 ''' </summary> Public Function DeepCopy(Of T)(ByVal target As T) As T Dim result As T Try Dim serializer As New System.Runtime.Serialization.DataContractSerializer(GetType(T)) Using mem As New System.IO.MemoryStream() serializer.WriteObject(mem, target) mem.Position = 0 result = CType(serializer.ReadObject(mem), T) End Using Catch ex As Exception Throw End Try Return result End Function
/// <summary> /// オブジェクトのディープコピーを行います。 /// </summary> public static T DeepCopy<T>(T source) where T : class { T result; try { var serializer = new System.Runtime.Serialization.DataContractSerializer(typeof(T)); using (var mem = new System.IO.MemoryStream()) { serializer.WriteObject(mem, source); mem.Position = 0; result = serializer.ReadObject(mem) as T; } } catch (Exception) { throw; } return result; }
DataContractSerializer もバイナリ使った方がパフォーマンスが良いとのことでしたが、使い方まだよく判ってないので保留。