Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0025: Einfache Serialisierung von Objekten

 von 

Beschreibung

Dieses Beispiel zeigt, wie man Instanzen von Klassen, d.h. Objekte, serialisieren kann. Bei der Serialisierung werden die Daten in einen Stream umgewandelt, der dann problemlos in eine Datei geschrieben oder das Netz geschickt werden kann. Anschliessend kann eine Deserialsierung erfolgen, wobei das Objekt so, wie es gespeichert wurde, wiederhergestellt wird. Hier werden Benutzerinformationen in einer Instanz der Klasse CPerson gehalten, die aus einer Datei geladen bzw. in eine Datei exportiert werden können.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Framework-Version(en):

.NET Framework 1.0, .NET Framework 1.1, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5

.NET-Version(en):

Visual Basic 2002, Visual Basic 2003, Visual Basic 2005, Visual Basic 2008

Download:

Download des Beispielprojektes [1,91 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 2002/2003
' Option Strict:    An
' Option Explicit:  An
'
' Referenzen: 
'  - System
'  - System.Data
'  - System.XML
'  - System.Windows.Forms
'
' Imports: 
'  - Microsoft.VisualBasic
'  - System
'  - System.Collections
'  - System.Data
'  - System.Diagnostics
'

' ##############################################################################
' ################################ modMain.vb ##################################
' ##############################################################################
Option Explicit On 
Option Strict On

Imports System
Imports System.IO
Imports System.Windows.Forms
Imports System.Runtime.Serialization.Formatters.Binary

Public Module modMain
    Private m_persUser As CPerson
    Private m_strDataFileName As String = _
      Application.StartupPath & "\settings.dat"

    Public Sub Main()
        Restore()
        Console.WriteLine("Tool zum Ändern der " & _
          "Benutzerinformationen")
        Console.WriteLine("Person mit Namen ""{0}""" & _
          " ist aktiv.", m_persUser.Name)
        Console.Write("Geben Sie den neuen Namen ein: ")
        m_persUser.Name = Console.ReadLine()
        Console.WriteLine("Person hat nun den Namen " & _
          """{0}"".", m_persUser.Name)
        Save()
        Console.WriteLine("Person gespeichert, " & _
          " Enter beendet das Programm.")
        Console.ReadLine()
    End Sub

    Private Sub Save()
        Dim fs As New FileStream(m_strDataFileName, _
          FileMode.OpenOrCreate)
        Dim bf As New _
          BinaryFormatter()
        bf.Serialize(fs, m_persUser)
        fs.Close()
    End Sub

    Private Sub Restore()

        ' Hier kann ein Fehler auftreten, wenn die 
        ' Datei nicht existiert oder wenn die Datei
        ' sich nicht deserialisieren lässt. Das Prüfen,
        ' ob die Datei existiert, ersparen wir
        ' uns hier, der Code dazu wäre "If 
        ' File.Exists(m_strDataFileName) Then...".
        Try
            Dim fs As New FileStream(m_strDataFileName, _
              FileMode.Open)
            Dim bf As New BinaryFormatter()
            m_persUser = CType(bf.Deserialize(fs), CPerson)
            fs.Close()

            ' Die Datei existiert nicht oder es ist 
            ' ein Fehler bei der Deserialisierung 
            ' aufgetreten, daher wird ein Objekt mit
            ' den Standardeinstellungen angelegt.
        Catch

            m_persUser = New CPerson()
        End Try
    End Sub

    <Serializable()> _
    Private Class CPerson
        Public Name As String
        Public Age As Integer
        Public Married As Boolean
        Public Knowledge As Knowledge
    End Class

    <Serializable()> _
    Private Structure Knowledge
        Public VB As Boolean
        Public CSharp As Boolean
    End Structure
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.

Methode oder Datenobjekt nicht gefunden - Bö 09.10.12 20:12 7 Antworten

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 3 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Timo am 21.03.2007 um 15:19

Es werden zusätzliche Daten generiert. Ein Beispiel: Ich möchten den Wert 66 speichern und verwende dazu ein Bytearray in der Grösse 1.

Data(0) = 66 'Ein Arraywert in der Grösse 1
Entspricht Hex = 42
[cpp]
00 01 00 00 00 FF FF FF FF 01 00 00 00 00 00 00 00 10 01 00 00 00 01 00
00 00 08 08 42 00 00 00 0B
[/cpp]
Gruss Timo

Kommentar von Jonny am 23.11.2004 um 13:50

Hallo,
das beispiel zu diesem Thema ist ja nach plausiebel. Doch woran kann es liegen, dass man solch einen Fehler bekommnt:

Eine nicht behandelte Ausnahme des Typs 'System.Runtime.Serialization.SerializationException' ist in mscorlib.dll aufgetreten.

Zusätzliche Informationen: Der für die Deserialisierung eines Objekts mit dem Typ ITPMapClasses.LocationQuery erforderliche Konstruktor wurde nicht gefunden.

Mein Code den ich benutze lautet wie folgt:

Private Sub Schreiben()
'Dim FStream = New IO.FileStream("test.txt", IO.FileMode.Create, IO.FileAccess.Write)
'Dim BWriter As New IO.BinaryWriter(FStream)
Dim TheLocationQuery As New LocationQuery
Dim myFileStream As Stream = File.Create("SavedLoan.bin")
Dim serializer As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
TheLocationQuery.Name = "Na Du"
TheLocationQuery.Caption = "Ich bins"
'TheLocationQuery.CombineBy = MapPoint.GeoCombineDataBy.geoCombineByAdd

serializer.Serialize(myFileStream, TheLocationQuery)
myFileStream.Close()
End Sub
Private Sub Lesen()

'Dim TheLocationQuery
'Dim FStream = New IO.FileStream("SavedLoan.bin", IO.FileMode.Open, IO.FileAccess.Read)
Dim FStream As Stream = File.OpenRead("SavedLoan.bin")
'Dim BReader As New IO.BinaryReader(FStream)
Dim TheLocationQuery As New LocationQuery
Dim deserializer As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
TheLocationQuery = CType(deserializer.Deserialize(FStream), LocationQuery)
'Console.WriteLine(BReader.ReadByte)
'Console.WriteLine(BReader.ReadDouble)
'Console.WriteLine(BReader.ReadBoolean)
MsgBox("Name: " + TheLocationQuery.Name)
MsgBox("Caption: " + TheLocationQuery.Caption)
MsgBox("CombineBy: " + TheLocationQuery.CombineBy)
'MsgBox("Query: " + TheLocationQuery.Query)
'BReader.Close()
FStream.Close()
End Sub

===== Mein Objekt ========
<Serializable()> Public Class LocationQuery


Implements System.Runtime.Serialization.ISerializable

Private msName As String
Private msCaption As String
Private msQuery As String
Private LocationQueryVersion As String
Private mcolParameter As TheParameter

Private meMapType As GeoDataMapType
'nur für Datenkarten
Private meShowBy As GeoShowDataBy
Private meCombineBy As GeoCombineDataBy
Private meRangeType As GeoDataRangeType

Public gnManID As Long

Public Sub New() 'ByVal info As System.Runtime.Serialization.SerializationInfo, ByVal context As System.Runtime.Serialization.StreamingContext)
msCaption = Nothing
msName = Nothing
msQuery = Nothing
LocationQueryVersion = Nothing
meShowBy = Nothing
meRangeType = Nothing
gnManID = Nothing
CombineBy = Nothing
mcolParameter = New TheParameter
meMapType = GeoDataMapType.geoDataMapTypePushpin
End Sub
......
....
End Class

Wäre sehr dankbar für einen Vorschlag!

Gruss Jonny

Kommentar von Sunray am 25.12.2003 um 14:14

Hat bei mir bestens funktioniert.

Zuerst wollte ich mein Objekt mit XML serialisieren.
Da hatte ich Probleme mit einer Hashtable.

So funktioniert es bestens...