VB.NET-Tipp 0025: Einfache Serialisierung von Objekten
von Herfried Wagner
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: | 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: |
' 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.
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...