Objekt-Serialisierung mit C#.NET / Objekt-Serialisierung mit VisualBasic.NET

Objekt-Serialisierung mit VisualBasic.NET

Objekt-Serialisierung mit VisualBasic.NET

➪ Wie in anderen Programmiersprachen können XML-Dokumente auch in VisualBasic.NET durch Serialisierung von Objekten bzw. Objektlisten erzeugt werden.

pic/VBNET_Objektserialisierung.png

Dieses Verfahren erlaubt analog auch die Deserialisierung von XML in VisualBasic.NET-Objekte. Als Beispiel dient die Klasse Person.


Namespace VBNETSchulung
  <Serializable>
  Public Class Person
    Private _Vorname As String = ""
    Private _Nachname As String = ""
    Private _Alter As Integer = 0
    ''' <summary>Lese- und Schreibproperty Vorname</summary>
    Public Property Vorname As String
      Get
        Return _Vorname
      End Get
      Set(value As String)
        _Vorname = value
      End Set
    End Property
    ''' <summary>Lese- und Schreibproperty Nachname</summary>
    Public Property Nachname As String
      Get
        Return _Nachname
      End Get
      Set(value As String)
        _Nachname = value
      End Set
    End Property
    ''' <summary>Lese- und Schreibproperty Alter</summary>
    Public Property Alter As Integer
      Get
        Return _Alter
      End Get
      Set(value As Integer)
        _Alter = Math.Abs(value)
      End Set
    End Property
    ''' <summary>Standard-Konstruktor</summary>
    Public Sub New()
    End Sub
    ''' <summary>Parametrisierter Konstruktor</summary>
    Public Sub New(vn As String, nn As String, a As Integer)
      Me.Vorname = vn
      Me.Nachname = nn
      Me.Alter = a
    End Sub
    Public Shared Function CreateInstance() As Person
      Return New Person()
    End Function
    Public Overrides Function ToString() As String
      Return String.Format("{0} {1} ist {2} Jahre alt", Me.Vorname,
                 Me.Nachname, Me.Alter)
    End Function
  End Class
End Namespace

Von dieser Klasse werden mehrere Objekte erzeugt und in eine generische Liste, die ausschließlich Person-Objekte akzeptiert, eingefügt. Anschließend soll die gesamte Liste (mit allen Person-Objekten darin) in ein XML-Dokument serialisiert werden. Dies geschieht sehr einfach mit den Klassen XmlSerializer und XmlWriter:


  Imports System.Collections.Generic
  Imports System.Xml.Serialization
  Sub XMLSerialisierungsdemo()
    Dim personen As New List(Of VBNETSchulung.Person)
    personen.Add(
         New VBNETSchulung.Person("Ludwig", "Lustschlos", 44))
    personen.Add(
         New VBNETSchulung.Person("Achim", "Achtlos", 33))
    personen.Add(
         New VBNETSchulung.Person("Stefan", "Schlaflos", 22))
    personen.Add(
         New VBNETSchulung.Person("Anton", "Appetitlos", 30))
    Dim ser As XmlSerializer
    ser = New XmlSerializer(personen.GetType())
    Dim xw As System.Xml.XmlWriter 
    xw = System.Xml.XmlWriter.Create("C:\wg\personen.xml")
    ser.Serialize(xw, personen)
  End Sub

Die XmlSerializer-Serialisierung generiert das folgende XML-Dokument in Elementschreibweise:


<ArrayOfPerson 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <Person>
  <Vorname>Ludwig</Vorname>
  <Nachname>Lustschlos</Nachname>
  <Alter>44</Alter>
 </Person>
 <Person>
  <Vorname>Achim</Vorname>
  <Nachname>Achtlos</Nachname>
  <Alter>33</Alter>
 </Person>
 <Person>
  <Vorname>Stefan</Vorname>
  <Nachname>Schlaflos</Nachname>
  <Alter>22</Alter>
 </Person>
 <Person>
  <Vorname>Anton</Vorname>
  <Nachname>Appetitlos</Nachname>
  <Alter>30</Alter>
 </Person>
</ArrayOfPerson>

Umgekehrt wird im Deserialisierungs-Prozess die generierte XML-Datei wieder in eine generische Liste konvertiert:


  Imports System.Xml.Serialization
  Sub Deserialisierung_Demo()
    Dim personen As New List(Of VBNETSchulung.Person)
    Dim ser As New XmlSerializer(personen.GetType())
    Using fs As New System.IO.FileStream
             ("C:\wg\personen.xml", System.IO.FileMode.Open)
      personen = ser.Deserialize(fs)
    End Using
    For Each p As VBNETSchulung.Person In personen
      Console.WriteLine(p)
    Next
  End Sub

Mit dem erzielten Ergebnis sehen Sie, dass die Deserialisierung aus dem XML-Dokument funktioniert hat:


Ludwig Lustschlos ist 44 Jahre alt
Achim Achtlos ist 33 Jahre alt
Stefan Schlaflos ist 22 Jahre alt
Anton Appetitlos ist 30 Jahre alt

Arbeiten mit Xml.Serialization

Im .NET Framework gibt es die Möglichkeit zu einer attributorientierten Programmierung. Damit sind keine XML-Attribute gemeint, sondern die Möglichkeiten der abstrakten (mustinherit) Attribute-Klasse, die die Grundlage für sehr brauchbare Klassen im Namespace System.Xml.Serialization darstellt.

Wenn Sie die Properties der Person-Klasse noch z.B. durch passende Xml.Serialization.XmlAttribute erweitern, ...


Namespace VBNETSchulung
  <Serializable>
  Public Class Person
    Private _Vorname As String = ""
    Private _Nachname As String = ""
    Private _Alter As Integer = 0
    ''' <summary>Lese- und Schreibproperty Vorname</summary>
    <Xml.Serialization.XmlAttribute("vorname")>
    Public Property Vorname As String
      Get
        Return _Vorname
      End Get
      Set(value As String)
        _Vorname = value
      End Set
    End Property
    ''' <summary>Lese- und Schreibproperty Nachname</summary>
    <Xml.Serialization.XmlAttribute("nachname")>
    Public Property Nachname As String
      Get
        Return _Nachname
      End Get
      Set(value As String)
        _Nachname = value
      End Set
    End Property
    ''' <summary>Lese- und Schreibproperty Alter</summary>
    <Xml.Serialization.XmlAttribute("alter")>
    Public Property Alter As Integer
      Get
        Return _Alter
      End Get
      Set(value As Integer)
        _Alter = Math.Abs(value)
      End Set
    End Property
    ''' <summary>Standard-Konstruktor</summary>
    Public Sub New()
    End Sub
    ''' <summary>Parametrisierter Konstruktor</summary>
    Public Sub New(vn As String, nn As String, a As Integer)
      Me.Vorname = vn
      Me.Nachname = nn
      Me.Alter = a
    End Sub
    Public Shared Function CreateInstance() As Person
      Return New Person()
    End Function
    Public Overrides Function ToString() As String
      Return String.Format("{0} {1} ist {2} Jahre alt", Me.Vorname,
                 Me.Nachname, Me.Alter)
    End Function
  End Class
End Namespace

... dann erhalten Sie die XML-basierte Objektserialisierung in dieser Form:


<ArrayOfPerson 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <Person vorname="Ludwig" nachname="Lustschlos" alter="44" />
 <Person vorname="Achim"  nachname="Achtlos"    alter="33" />
 <Person vorname="Stefan" nachname="Schlaflos"  alter="22" />
 <Person vorname="Anton"  nachname="Appetitlos" alter="30" />
</ArrayOfPerson>

Die Deserialisierung des XML-Dokuments in Objekte ergibt wieder dasselbe Ergebnis:


Ludwig Lustschlos ist 44 Jahre alt
Achim Achtlos ist 33 Jahre alt
Stefan Schlaflos ist 22 Jahre alt
Anton Appetitlos ist 30 Jahre alt

wg / 3. April 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/Objektserialisierung_vbnet.html