[ VB.NET / C# ] クラスオブジェクトをディープコピー ( BinaryFormatter.Serialize )

Pocket

ここでは、バイナリ形式でのシリアライズによってクラスオブジェクトのディープコピーを行うサンプルプログラムを掲載しています。

スポンサーリンク

シリアライズによるクラスオブジェクトのディープコピー

本サンプルプログラムでは、シリアライズによるディープコピーを行うクラスには Serializable を、シリアライズを行いたくないメンバ変数には、NonSerialized を定義しています。詳細はサンプル内のコメントと合わせて確認してみてください。

ポイント

  • クラス内にメンバ変数に List など他のオブジェクトが存在する場合でも、シャローコピーではなくディープコピーが行われる
  • メンバ変数のアクセスレベル ( public, protected, private ) には関係なくコピーされる

VB.NET

' シリアライズによる、ディープコピーを行うクラス定義
<Serializable>
Public Class GesuClass

    ' このメンバはシリアル化の対象外
    <NonSerialized>
    Private _member1 As Boolean

    ' シリアル化の対象
    Public _member2 As String

    Sub New()
        _member1 = True
        _member2 = "私以外私じゃないの"
    End Sub

End Class

'Imports System.IO
'Imports System.Runtime.Serialization.Formatters.Binary

    ' コピーするクラスオブジェクト
    Dim gesu As GesuClass = New GesuClass()

    ' コピーしたクラスオブジェクトを格納する器として
    ' MemoryStream を使用する
    Using ms As New MemoryStream()

        ' バイナリフォーマッタの作成
        Dim bf As New BinaryFormatter()

        ' クラスオブジェクトをシリアライズ(コピー)する
        bf.Serialize(ms, gesu)

        ' ストリームの位置を先頭に戻す(デシリアライズのため)
        ms.Position = 0L

        ' MemoryStream に格納したクラスオブジェクトをデシリアライズする
        ' 単純に先頭から読み込みなおしているだけ
        Dim gesuCopy As GesuClass = CType(bf.Deserialize(ms), GesuClass)

    End Using

C#

// シリアライズによる、ディープコピーを行うクラス定義
[Serializable]
public class GesuClass
{
    // このメンバはシリアル化の対象外
    [NonSerialized]
    private bool _member1;

    // シリアル化の対象
    public string _member2 { get; set; }

    public GesuClass()
    {
        _member1 = true;
        _member2 = "私以外私じゃないの";
    }
}

//using System.IO;
//using System.Runtime.Serialization.Formatters.Binary;

    // コピーするクラスオブジェクト
    GesuClass gesu = new GesuClass();

    // コピーしたクラスオブジェクトを格納する器として
    // MemoryStream を使用する
    using (MemoryStream ms = new MemoryStream())
    {
        // バイナリフォーマッタの作成
        BinaryFormatter bf = new BinaryFormatter();

        // クラスオブジェクトをシリアライズ(コピー)する
        bf.Serialize(ms, gesu);

        // ストリームの位置を先頭に戻す(デシリアライズのため)
        ms.Position = 0L;

        // MemoryStream に格納したクラスオブジェクトをデシリアライズする
        // 単純に先頭から読み込みなおしているだけ
        GesuClass gesuCopy = (GesuClass)bf.Deserialize(ms);
    }
参考
スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *