次の例では、3 つのフロアと各フロアに 4 つの部屋がある単純な建物を作成します。これは過度に複雑なオブジェクト グラフではありませんが、アイデアが伝わるはずです。System.Runtime.Serialization.ISerializableを実装してシリアル化プロセスを制御できるという考え方です。
この例では、Floors 型のSystem.Runtime.Serialization.ISerializableのみを実装しました。Floors タイプでは、Rooms リストのシリアライズとデシリアライズの方法を制御します。
あなたのタイプの特定の詳細、特に計算が重いプロパティについて詳しく知らなければ、具体的に話すことはできません。ただし、System.Runtime.Serialization.ISerializableを実装してシリアル化プロセスを制御することによって提供される手法を使用することで、探している結果を達成できると思います。
シリアル化ストリームには何でも追加でき、クラスにすべてを追加する必要はありません。ただし、逆シリアル化コンストラクターが実行された後は、少なくともクラスを「正しい」ものにする必要があります。シリアル化ストリームに何を入れるかはあなた次第です。
ただし、これはBinary Serializationでのみ機能し、Xml Serializationでは機能しないことに注意してください。
Module Module1
Sub Main()
Dim floor1 As New Floor()
floor1.Rooms.Add(New Rooms(101))
floor1.Rooms.Add(New Rooms(102))
floor1.Rooms.Add(New Rooms(103))
floor1.Rooms.Add(New Rooms(104))
Dim floor2 As New Floor()
floor2.Rooms.Add(New Rooms(201))
floor2.Rooms.Add(New Rooms(202))
floor2.Rooms.Add(New Rooms(203))
floor2.Rooms.Add(New Rooms(204))
Dim floor3 As New Floor()
floor3.Rooms.Add(New Rooms(301))
floor3.Rooms.Add(New Rooms(302))
floor3.Rooms.Add(New Rooms(303))
floor3.Rooms.Add(New Rooms(304))
Dim tower As New Building()
tower.Floors.Add(floor1)
tower.Floors.Add(floor2)
tower.Floors.Add(floor3)
Dim byteArray As Byte() = Serialized(tower)
Dim backAgain As Building = DeSerialized(byteArray)
End Sub
Private Function Serialized(ByVal tower As Building) As Byte()
Using ms As New System.IO.MemoryStream()
Dim formatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
formatter.Serialize(ms, tower)
Return ms.GetBuffer()
End Using
End Function
Private Function DeSerialized(ByVal byteArray As Byte()) As Building
Using ms As New System.IO.MemoryStream(byteArray)
Dim formatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
ms.Position = 0
Return DirectCast(formatter.Deserialize(ms), Building)
End Using
End Function
End Module
<Serializable()>
Public Class Building
Public Sub New()
End Sub
Private _Floors As New List(Of Floor)
Public ReadOnly Property Floors As List(Of Floor)
Get
Return _Floors
End Get
End Property
End Class
<Serializable()>
Public Class Floor
Implements System.Runtime.Serialization.ISerializable
Public Sub New()
End Sub
Public Sub New(ByVal info As Runtime.Serialization.SerializationInfo, ByVal context As Runtime.Serialization.StreamingContext)
Dim counter As Integer = info.GetInt32("RoomCount")
For index As Integer = 0 To counter - 1
_Rooms.Add(DirectCast(info.GetValue(String.Format("Room{0}", index.ToString()), GetType(Rooms)), Rooms))
Next
End Sub
Private _Rooms As New List(Of Rooms)
Public ReadOnly Property Rooms As List(Of Rooms)
Get
Return _Rooms
End Get
End Property
Public Sub GetObjectData(info As System.Runtime.Serialization.SerializationInfo, context As System.Runtime.Serialization.StreamingContext) Implements System.Runtime.Serialization.ISerializable.GetObjectData
info.AddValue("RoomCount", _Rooms.Count)
For index As Integer = 0 To _Rooms.Count - 1
info.AddValue(String.Format("Room{0}", index.ToString()), _Rooms(index))
Next
End Sub
End Class
<Serializable()>
Public Class Rooms
Public Sub New()
End Sub
Public Sub New(ByVal roomNum As Integer)
Me.New()
_RoomNumber = roomNum
End Sub
Private _RoomNumber As Integer = 0
Public Readonly Property RoomNumber As Integer
Get
Return _RoomNumber
End Get
End Property
End Class