Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0122: Serialisierung von Objekten

 von 

Beschreibung

Hier wird gezeigt wie man Objekte serialisieren - d.h. sie in einem geeigneten Format abspeichern bzw. laden - kann. Als Varianten wird hier die Serialisierung in XML und binär vorgestellt. Durch die Verwendung von generischen Extension-Methoden kann der Mechanismus sehr intuitiv angewendet werden.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Framework-Version(en):

.NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5

.NET-Version(en):

Visual Basic 2008

Download:

Download des Beispielprojektes [12,15 KB]

' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!

' Projektversion:   Visual Studio 2008
' Option Strict:    An
' Option Explicit:  An
' Option Infer:     Aus
'
' Referenzen: 
'  - System
'  - System.Data
'  - System.Deployment
'  - System.Drawing
'  - System.Windows.Forms
'  - System.Xml
'  - System.Core
'  - System.Xml.Linq
'  - System.Data.DataSetExtensions
'
' Imports: 
'  - Microsoft.VisualBasic
'  - System
'  - System.Collections
'  - System.Collections.Generic
'  - System.Data
'  - System.Drawing
'  - System.Diagnostics
'  - System.Windows.Forms
'  - System.Linq
'  - System.Xml.Linq
'

' ##############################################################################
' ################################# Class1.vb ##################################
' ##############################################################################
' Das Attribut wird für die Binaer Serialisierung benötigt
<Serializable()> Public Class Class1
    Private myProp1 As String
    Private myProp2 As Integer

    Public Property Prop2() As Integer
        Get
            Return myProp2
        End Get
        Set(ByVal value As Integer)
            myProp2 = value
        End Set
    End Property


    Public Property Prop1() As String
        Get
            Return myProp1
        End Get
        Set(ByVal value As String)
            myProp1 = value
        End Set
    End Property

    Public Sub New(ByVal prop1 As String, ByVal prop2 As Integer)
        Me.Prop1 = prop1
        Me.Prop2 = prop2
    End Sub

    ' Die Sub New ist für die XML Serialisierung notwendig
    Public Sub New()
    End Sub
End Class

' ##############################################################################
' ################################# Form1.vb ###################################
' ##############################################################################
Public Class Form1
    Private xmlFile As String = Application.CommonAppDataPath & "\DataTest.xml"
    Private binFile As String = Application.CommonAppDataPath & "\DataTest.bin"

    Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load

        Stop
        Dim a As New Class1("ABC", 123456789)
        Dim b As New Class1("EDF", 987654321)
        a.SaveXml(xmlFile)
        b.SaveBin(binFile)
        Stop
        Dim x As Class1 = Nothing
        Dim y As Class1 = Nothing
        ' Überzeugen Sie sich im Debugger, dass vorher die Variablen leer sind, 
        ' und nachher gültige Objekte enthalten. Nämlich Klone der Objekte, die 
        ' gespeichert wurden. Da die Anwendung nur zum Testen ist, ist eine 
        ' weitere "Ergebnis-Anzeige" nicht implementiert.
        Stop
        x.LoadXml(xmlFile)
        y.LoadBin(binFile)
        Stop
    End Sub
End Class

' ##############################################################################
' ################################ SaveLoad.vb #################################
' ##############################################################################
Imports System.Runtime.CompilerServices
Imports System.Runtime.Serialization.Formatters.Binary

<HideModuleName()> Public Module SaveLoad
    <Extension()> Public Sub SaveXml(Of T)(ByVal obj As T, ByVal file As String)
        Using fs As New IO.FileStream(file, IO.FileMode.OpenOrCreate)
            Dim xmlSer As New Xml.Serialization.XmlSerializer(GetType(T))
            xmlSer.Serialize(fs, obj)
            fs.Flush()
        End Using
    End Sub

    <Extension()> Public Sub LoadXml(Of T)(ByRef obj As T, ByVal file As String)
        Using fs As New IO.FileStream(file, IO.FileMode.OpenOrCreate)
            Dim xmlSer As New Xml.Serialization.XmlSerializer(GetType(T))
            obj = DirectCast(xmlSer.Deserialize(fs), T)
        End Using
    End Sub

    <Extension()> Public Sub SaveBin(Of T)(ByVal obj As T, ByVal file As String)
        Using fs As New IO.FileStream(file, IO.FileMode.OpenOrCreate)
            Dim bf As New BinaryFormatter
            bf.Serialize(fs, obj)
            fs.Flush()
        End Using
    End Sub

    <Extension()> Public Sub LoadBin(Of T)(ByRef obj As T, ByVal file As String)
        Using fs As New IO.FileStream(file, IO.FileMode.OpenOrCreate)
            Dim bf As New BinaryFormatter
            obj = DirectCast(bf.Deserialize(fs), T)
        End Using
    End Sub
End Module

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.