Rubrik: Variablen/Strings | VB-Versionen: VB.NET | 07.11.06 |
Einfaches speichern von Objekten Den aktuellen Zustand eines Objekts in .Net sehr leicht im XML-Format speichern | ||
Autor: Daniel Bühling | Bewertung: | Views: 18.739 |
www.mysldworks.de | System: WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Den aktuellen Zustand eines Objekts kann man in .NET 2.0 sehr leicht im XML-Format speichern.
Man benötigt nur wenige Zeilen Code um auch sehr umfangreiche Objekte in eine Datei zu speichern. Dabei hilft uns die Klasse System.Xml.Serialization.XmlSerializer. Eine so erzeugte Datei kann jederzeit eben so leicht wieder in ein Objekt geladen werden.
Funktion zum Speichern eines Objekts:
''' <summary> ''' Der Inhalt des übergebenen Objekts wird im XML-Format ''' unter dem Speicherpfad gespeichert ''' </summary> ''' <typeparam name="T">Typ (Klasse) welche abgespeichert wird</typeparam> ''' <param name="Objekt">Objekt dessen Inhalt gespeichert wird</param> ''' <param name="Speicherpfad">Pfad unter welchem der Inhalt des ''' Objekts gespeichert wird, muss nicht mit xml enden</param> ''' <returns>Funktion erfolgreich durchgeführt</returns> ''' <remarks></remarks> Public Shared Function ObjektSpeichern(Of T)( _ ByVal Objekt As T, _ ByVal Speicherpfad As String) As Boolean Dim Serializer As System.Xml.Serialization.XmlSerializer Dim Stream As System.IO.FileStream = Nothing Try ' Stream zum Speichern öffen Stream = New System.IO.FileStream(Speicherpfad, _ IO.FileMode.Create) ' Übergebene Klasse in das XML-Format serialisieren Serializer = _ New System.Xml.Serialization.XmlSerializer( _ Objekt.GetType) ' Objekt abspeichern Serializer.Serialize(Stream, Objekt) ' Stream wieder schließen Stream.Close() Return True Catch ex As Exception If Not Stream Is Nothing Then Stream.Close() End If Debug.Print("Fehler" & ex.Message) Return False End Try End Function
Funktion zum Laden einer Klasse:
''' <summary> ''' Übergebenes Objekt wird mit dem Inhalt der ''' übergebenen XML-Datei befüllt ''' </summary> ''' <typeparam name="T">Typ (Klasse) welche abgespeichert wird</typeparam> ''' <param name="Ladepfad">Pfad der XML-Datei, muss mit der ''' Klasse serialisierbar sein</param> ''' <param name="Objekt">Objekt welches mit dem Inhalt der XML-Datei ''' befüllt wird</param> ''' <returns>Funktion erfolgreich durchgeführt</returns> ''' <remarks></remarks> Public Shared Function ObjektLaden(Of T)( _ ByVal Ladepfad As String, _ ByRef Objekt As T) _ As Boolean Dim Serializer As System.Xml.Serialization.XmlSerializer Dim Stream As System.IO.FileStream = Nothing Try ' Stream zum Lesen öffen Stream = New System.IO.FileStream(Ladepfad, IO.FileMode.Open) ' Übergebene Klasse in das XML-Format serialisieren Serializer = _ New System.Xml.Serialization.XmlSerializer(Objekt.GetType) ' Objekt mit dem Inhalt der Datei befüllen Objekt = CType(Serializer.Deserialize(Stream), T) ' Stream wieder schließen Stream.Close() Return True Catch ex As Exception If Not Stream Is Nothing Then Stream.Close() End If Debug.Print("Fehler" & ex.Message) Return False End Try End Function
Beispiel für das Speichern und Laden von Objekten
Fügen Sie in ein leeres "Windows Anwendung" Projekt eine Klasse mit folgendem Code hinzu:
Public Class Class1 Dim sTest1 As String Dim sTest2 As String Dim iTest1 As Integer Dim bTest1 As Boolean Public Property String1() As String Get Return sTest1 End Get Set(ByVal value As String) sTest1 = value End Set End Property Public Property String2() As String Get Return sTest2 End Get Set(ByVal value As String) sTest2 = value End Set End Property Public Property Integer1() As Integer Get Return iTest1 End Get Set(ByVal value As Integer) iTest1 = value End Set End Property Public Property Boolean1() As Boolean Get Return bTest1 End Get Set(ByVal value As Boolean) bTest1 = value End Set End Property End Class
Wichtig ist, dass die Klasse, sowie die Propertys als Public deklariert werden.
Fügen Sie dem Projekt jetzt noch eine Form mit zwei Buttons hinzu und benennen die Buttons "btnLaden" und "btnSpeichern". In der Codeansicht des Formulars fügen Sie nun bitte folgenden Code ein:
Private Sub btnSpeichern_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnSpeichern.Click ' Objekt mit der Class1 zum Testen deklarieren Dim oSpeichern As New Class1 ' Objekt befüllen oSpeichern.Boolean1 = True oSpeichern.Integer1 = 1234 oSpeichern.String1 = "ABC" oSpeichern.String2 = "defg" ' Objekt auf dem Desktop speichern Dim sPfad As String sPfad = System.Environment.GetFolderPath( _ Environment.SpecialFolder.Desktop) sPfad = sPfad & "\Test.xml" ObjektSpeichern(Of Class1)(oSpeichern, sPfad) End Sub
Private Sub btnLaden_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnLaden.Click ' Objekt mit der Class1 zum Testen deklarieren Dim oLaden As New Class1 ' Objekt mit der Datei auf dem Desktop befüllen Dim sPfad As String sPfad = System.Environment.GetFolderPath( _ Environment.SpecialFolder.Desktop) sPfad = sPfad & "\Test.xml" If IO.File.Exists(sPfad) Then ObjektLaden(Of Class1)(sPfad, oLaden) ' Inhalt des Testobjekts in das Direktfenster ausgeben Debug.Print(CStr(oLaden.Boolean1)) Debug.Print(CStr(oLaden.Integer1)) Debug.Print(oLaden.String1) Debug.Print(oLaden.String2) Else Debug.Print("Die Datei: " & sPfad & " ist nicht vorhanden") End If End Sub
Fügen Sie der Form abschließend noch die beiden am Anfang aufgezeigten Funktion zum Laden und Speichern der Objekte hinzu (Function ObjektSpeichern und Function ObjektLaden).
Wenn Sie nun auf den Button "btnSpeichern" klicken wird das Objekt, mit dem im Code bestimmten Inhalt, auf Ihrem Desktop unter Test.xml gespeichert.
Die Test.xml Datei sollte folgenden Inhalt haben:
<?xml version="1.0"?> <Class1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <String1>ABC</String1> <String2>defg</String2> <Integer1>1234</Integer1> <Boolean1>true</Boolean1> </Class1>
Durch Klick auf "btnLaden" wird ein leeres Objekt mit dem Inhalt der Test.xml befüllt.