.NETで作る!

.NETに関するあれこれ(C#、VB.NET)

Serializerでディープコピー

元ネタ

shinshu.fm

自分の古い記事が元ネタ。これ今ならもっと簡単にかける。 改善点は

  • ファイルに書きださない。
  • クローン対象に属性を書く必要なし。

コード

Imports System.IO
Imports System.Runtime.Serialization

'ref System.Runtime.Serialization.dll

Public Class Serializer
    ''' <summary>
    ''' Clone by memorystream
    ''' </summary>
    ''' <typeparam name="T"></typeparam>
    ''' <param name="src"></param>
    ''' <returns></returns>
    Public Shared Function Clone(Of T)(src As T) As T
        Dim ser As New DataContractSerializer(GetType(T))
        Using m = New MemoryStream
            ser.WriteObject(m, src)
            m.Position = 0
            Return DirectCast(ser.ReadObject(m), T)
        End Using
    End Function
End Class

使う

Public Class Entity
    Public Property Id As Integer
    Public Property Name As String
End Class

Module Module1
    Sub Main()
        Dim c As New Entity With {.Id = 1, .Name = "Sample"}

        Dim x = Serializer.Clone(c)

        Console.WriteLine("c.Id   = {0}", c.Id)   '1
        Console.WriteLine("c.Name = {0}", c.Name) 'Sample

        Console.WriteLine("x.Id   = {0}", x.Id)   '1
        Console.WriteLine("x.Name = {0}", x.Name) 'Sample

        Console.WriteLine("c.Equlas(x) = {0}", c.Equals(x)) 'False

        Console.WriteLine("press any key to end.")
        Console.ReadKey()
    End Sub
End Module
. .