投稿者 YuO  (社会人) 投稿日時 2012/7/5 10:00:22
出遅れていますが……。


シリアライズしたい内容を一つのインスタンスにできないのですか。
例えば,Tuple(Of List(Of Stone(,)), List(Of Stone))型のインスタンスとかに。

複数回シリアライズ/デシリアライズした場合,それぞれのシリアライズ/デシリアライズにおいて,
本来共有されていたインスタンスが別のインスタンスに分離します。
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary

<Serializable()>
Class Foo
    Private _value As Integer

    Public Sub New(value As Integer)
        _value = value
    End Sub

    Public Property Value As Integer
        Set(value As Integer)
            _value = value
        End Set
        Get
            Return _value
        End Get
    End Property

    Public Overrides Function ToString() As String
        Return String.Format("{{ Value : {0} }}", _value)
    End Function

    Shared Sub Main()
        Dim f1 As Foo, f2 As Foo
        f1 = New Foo(10)
        f2 = f1

        Console.WriteLine("初期")
        Console.WriteLine("f1 : {0} / f2 : {1}", f1, f2)
        f1.Value = 20
        Console.WriteLine("f1 : {0} / f2 : {1}", f1, f2)
        Console.WriteLine()

        Dim ms As MemoryStream
        Dim formatter As New BinaryFormatter

        ms = New MemoryStream()
        formatter.Serialize(ms, f1)
        formatter.Serialize(ms, f2)

        ms.Seek(0L, SeekOrigin.Begin)
        Dim f3 As Foo = DirectCast(formatter.Deserialize(ms), Foo)
        Dim f4 As Foo = DirectCast(formatter.Deserialize(ms), Foo)

        Console.WriteLine("独立")
        Console.WriteLine("f3 : {0} / f4 : {1}", f3, f4)
        f3.Value = 30
        Console.WriteLine("f3 : {0} / f4 : {1}", f3, f4)
        Console.WriteLine()

        ms = New MemoryStream()
        formatter.Serialize(ms, Tuple.Create(f1, f2))

        ms.Seek(0L, SeekOrigin.Begin)
        Dim t As Tuple(Of Foo, Foo) = DirectCast(formatter.Deserialize(ms), Tuple(Of Foo, Foo))
        Dim f5 As Foo = t.Item1
        Dim f6 As Foo = t.Item2

        Console.WriteLine("一括")
        Console.WriteLine("f5 : {0} / f6 : {1}", f5, f6)
        f5.Value = 30
        Console.WriteLine("f5 : {0} / f6 : {1}", f5, f6)
        Console.WriteLine()

        Console.ReadLine()
    End Sub
End Class
これを実行すると,
初期
f1 : { Value : 10 } / f2 : { Value : 10 }
f1 : { Value : 20 } / f2 : { Value : 20 }

独立
f3 : { Value : 20 } / f4 : { Value : 20 }
f3 : { Value : 30 } / f4 : { Value : 20 }

一括
f5 : { Value : 20 } / f6 : { Value : 20 }
f5 : { Value : 30 } / f6 : { Value : 30 }
となります。
f3.Valueの変更によってf4.Valueは変更されませんが,
f5.Valueの変更によってf6.Valueはf1/f2の関係と同じく変更されます。

これは単純な例ですが,オブジェクトのグラフを辿ると共有している可能性があるので,
基本的には一括でシリアライズ/デシリアライズした方が問題が少なくなると思います。