DataContractSerializer を使ってディープコピー

.NET でオブジェクトをディープコピーする方法探してたら、実にエクセレントな記事を見つけました。

どんなオブジェクトでもコピーできる汎用のディープコピー処理(ICloneable, MemberWiseClone, Serializable, BinaryFormatter, MemoryStream)


ただし速度的に気になったので BinaryFormatter で調べていたら、neue.cc さんのブログにこんな記事が!

.NET(C#)におけるシリアライザのパフォーマンス比較


どうやら DataContractSerializer の方が性能が良さ気です。シリアライズ時のサイズは大きくなりますが、よほど巨大なオブジェクトじゃない限りサイズを気にする必要はなさそうです。


また、同じく neue.cc さんの記事

.NETの標準シリアライザ(XML/JSON)の使い分けまとめ


によれば、DataContractSerializer はいまや .NET の標準的なシリアライザーとのこと。
で、ディープコピーメソッド(DataContractSerializer 版) を書いてみました。
ちなみに参照設定には System.Runtime.Serialization が必要です。


VB

''' <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


C#

/// <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 もバイナリ使った方がパフォーマンスが良いとのことでしたが、使い方まだよく判ってないので保留。