掲示板お問い合わせランダムジャンプ

Top Index
Yahooは検索方式が変わったせいか、うまくサイト内検索できないなぁ。つーわけでグーグルに変更。


2008年04月11日
横着ディープコピー
「オブジェクトをディープコピーする」
ICloneableを実装したコードを書けばできそうですが、これが単純なようで意外と面倒。
クラスの構造が複雑だとさらに面倒。

それなら、いっそシリアル化して逆シリアル化したほうがいいじゃないと思った。
ということで、シリアル化/逆シリアル化してディープコピーを実装できるか試してみた。

以下、検証用コード

それなりにややこしいクラスで試してみました。
複写した結果は24行あたりをご覧ください。
ディープコピーになっていることが伺えるかと思います。

01Imports System.IO
02Imports System.Runtime.Serialization.Formatters.Binary
03
04Public Class Form1
05
06    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
07        Dim f1 As New Family With {.Address = "東京都"}
08        f1.PersonList.Add(New Person With {.Family = f1, .Id = 1, .Name = "Taro"})
09        f1.PersonList.Add(New Person With {.Family = f1, .Id = 2, .Name = "Hanako"})
10
11        'シリアライズ
12        Using fs As New FileStream("c:\data.bin", FileMode.Create)
13            Dim bf As New BinaryFormatter
14            bf.Serialize(fs, f1)
15        End Using
16
17        'デシリアライズ(擬似ディープコピー)
18        Dim f2 As New Family
19        Using fs As New FileStream("c:\data.bin", FileMode.Open)
20            Dim f As New BinaryFormatter
21            f2 = f.Deserialize(fs)
22        End Using
23
24        Debug.Print(f1.Equals(f1.PersonList(0).Family)) 'True になります
25        Debug.Print(f2.Equals(f2.PersonList(0).Family)) 'True になります
26        Debug.Print(f1.Equals(f2)) 'False になります
27        Debug.Print(f1.PersonList.Equals(f2.PersonList)) 'False になります
28    End Sub
29
30End Class
31
32<Serializable()> _
33Public Class Person
34
35    Private _Id As Integer
36    Public Property Id() As Integer
37        Get
38            Return _Id
39        End Get
40        Set(ByVal value As Integer)
41            _Id = value
42        End Set
43    End Property
44
45    Private _Name As String
46    Public Property Name() As String
47        Get
48            Return _Name
49        End Get
50        Set(ByVal value As String)
51            _Name = value
52        End Set
53    End Property
54
55    Private _Famliy As Family
56    Public Property Family() As Family
57        Get
58            Return _Famliy
59        End Get
60        Set(ByVal value As Family)
61            _Famliy = value
62        End Set
63    End Property
64
65End Class
66
67<Serializable()> _
68Public Class Family
69
70    Private _Address As String
71    Public Property Address() As String
72        Get
73            Return _Address
74        End Get
75        Set(ByVal value As String)
76            _Address = value
77        End Set
78    End Property
79
80    Private _PersonList As New List(Of Person)
81    Public Property PersonList() As List(Of Person)
82        Get
83            Return _PersonList
84        End Get
85        Set(ByVal value As List(Of Person))
86            _PersonList = value
87        End Set
88    End Property
89
90End Class
 powered by vb2html ver2.1b


[ 投稿者:mk3008 at 00:12 | VB.NETコーディングTips | コメント(0) | トラックバック(1) ]

この記事へのコメント

この記事へのトラックバック
インスタンスをコピーしたい
今回はあるインスタンスをコピーしたいという時に使える方法です。(もちろん参照のコピーではなく、あるインスタンスをメモリ空間ごとガバッとコピーすることです。)
...
投稿者: 3流プログラマのメモ書き at 2008-04-21 19:34:23

この記事へのトラックバックURL
http://shinshu.fm/MHz/88.44/a03195/0000234348.trackback

この記事の固定URL
http://shinshu.fm/MHz/88.44/archives/0000234348.html

記事へのコメント
 
認証コード:
画像に表示されるコードを半角英数字で入力して下さい。画像が読み難い場合はこちら
簡単演算認証: 8 + 9 =
足し算の答えを半角英数字で入力して下さい。
名前: [必須]
URL/Email:
タイトル:
コメント: