Ich würde das mit der Arrayliste ganz lassen. Es gibt bessere Alternativen dafür, wie die generischen Listen.
Hier mal ein Bsp.:
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.IO.Compression
Public Class Form1
Private mHaus As New Haus
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button1.Click
mHaus.Save()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button2.Click
mHaus = Serializer.DeSerialize(Of Haus)("d:\name.sav")
End Sub
End Class
<Serializable()> _
Public Class Haus
Private mListEtagen As New List(Of Etage)
Private mName As String
Public Property Etagen() As List(Of Etage)
Get
Return mListEtagen
End Get
Set(ByVal value As List(Of Etage))
mListEtagen = value
End Set
End Property
Public Property Name() As String
Get
Return mName
End Get
Set(ByVal value As String)
mName = value
End Set
End Property
Public Sub Save()
Serializer.Serialize(Of Haus)("d:\name.sav", Me)
End Sub
End Class
<Serializable()> _
Public Class Etage
Private mListRaeume As New List(Of Raum)
Private mName As String
Public Property Raeume() As List(Of Raum)
Get
Return mListRaeume
End Get
Set(ByVal value As List(Of Raum))
mListRaeume = value
End Set
End Property
Public Property Name() As String
Get
Return mName
End Get
Set(ByVal value As String)
mName = value
End Set
End Property
Public Sub New(ByVal name As String)
mName = name
End Sub
End Class
<Serializable()> _
Public Class Raum
Private mListObjekte As New List(Of String)
Private mName As String
Public Property Objekte() As List(Of String)
Get
Return mListObjekte
End Get
Set(ByVal value As List(Of String))
mListObjekte = value
End Set
End Property
Public Property Name() As String
Get
Return mName
End Get
Set(ByVal value As String)
mName = value
End Set
End Property
End Class
Public Class Serializer
Public Shared Sub Serialize(Of T)(ByVal compression As Boolean, ByVal path _
As String, ByVal instance As T)
Try
Dim stream As Stream = New FileStream(path, FileMode.OpenOrCreate)
Dim format As New BinaryFormatter
If compression Then stream = New GZipStream(stream, _
CompressionMode.Compress)
format.Serialize(stream, instance)
stream.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Public Shared Sub Serialize(Of T)(ByVal path As String, ByVal instance As T)
Serialize(False, path, instance)
End Sub
Public Shared Function DeSerialize(Of T)(ByVal compression As Boolean, _
ByVal path As String, ByVal defaultInstance As T) As T
Try
If Not File.Exists(path) Then
Return defaultInstance
End If
Dim stream As Stream = New FileStream(path, FileMode.OpenOrCreate)
Dim format As New BinaryFormatter
If compression Then stream = New GZipStream(stream, _
CompressionMode.Decompress)
DeSerialize = CType(format.Deserialize(stream), T)
stream.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Function
Public Shared Function DeSerialize(Of T)(ByVal path As String, ByVal _
defaultInstance As T) As T
Return DeSerialize(Of T)(False, path, defaultInstance)
End Function
Public Shared Function DeSerialize(Of T As New)(ByVal path As String) As T
Return DeSerialize(Of T)(path, New T)
End Function
Public Shared Function DeSerialize(Of T As New)(ByVal compression As _
Boolean, ByVal path As String) As T
Return DeSerialize(Of T)(compression, path, New T)
End Function
End Class Du hast halt drei Klassen(Raum,Etage und Haus), jede beinhaltet eine Liste mit der darunterliegenden Klasse. Du könntest also z.B. noch die Klasse "Dorf" hinzufügen.
Die Serialize-Klasse ist aus den vbarchiv-Tipps.
Maas |