Serialisierung ist der Prozess der Umwandlung eines Objekts in eine lineare Folge von Bytes, die als "Bytestrom" bezeichnet wird. Die Deserialisierung kehrt den Prozess nur um. Aber warum sollten Sie ein Objekt in einen Byte-Stream konvertieren wollen??
Der Hauptgrund ist, dass Sie das Objekt bewegen können. Betrachten Sie die Möglichkeiten. Da in .NET "alles ein Objekt ist", können Sie alles serialisieren und in einer Datei speichern. So können Sie Bilder, Datendateien und den aktuellen Status eines Programmmoduls serialisieren ("Status" ist wie eine Momentaufnahme Ihres Programms zu einem bestimmten Zeitpunkt, sodass Sie die Ausführung vorübergehend unterbrechen und später erneut starten können).
Sie können diese Objekte auch auf Datenträgern in Dateien speichern, über das Web senden, an ein anderes Programm übergeben und aus Sicherheitsgründen eine Sicherungskopie aufbewahren. Die Möglichkeiten sind buchstäblich endlos.
Aus diesem Grund ist die Serialisierung in .NET und Visual Basic ein so wichtiger Prozess. Im Folgenden finden Sie einen Abschnitt zur benutzerdefinierten Serialisierung durch Implementierung der ISerialisierbar Schnittstelle und Codierung a Neu und ein GetObjectData Subroutine.
Als erstes Beispiel für die Serialisierung wollen wir eines der einfachsten Programme ausführen, aber auch eines der nützlichsten: Daten serialisieren und dann Daten in einfachen Klassen in und aus einer Datei deserialisieren. In diesem Beispiel werden die Daten nicht nur serialisiert, sondern auch die Struktur der Daten wird gespeichert. Die Struktur hier ist in einem Modul deklariert, um die Dinge ... gut ... strukturiert zu halten.
Modul SerializeParms
Public Class ParmExample
Public Parm1Name As String = "Parm1 Name"
Öffentlicher Parm1Value As Integer = 12345
Öffentlicher Parm2Name als String
Öffentlicher Parm2Value als Dezimalzahl
Klasse beenden
Modul beenden
Anschließend können einzelne Werte in einer Datei wie der folgenden gespeichert werden:
Importiert System.Runtime.Serialization.Formatters.Binary
Importiert System.IO
Öffentliche Klasse Form1
Private Sub mySerialize_Click (_
ByVal Absender Als System.Object, _
ByVal e As System.EventArgs) _
Verarbeitet mySerialize.Click
Dim ParmData As New ParmExample
ParmData.Parm2Name = "Parm2 Name"
ParmData.Parm2Value = 54321.12345
Dim s As New FileStream ("ParmInfo", FileMode.Create)
Dim f As New BinaryFormatter
f.Serialize (s, ParmData)
s.Close ()
End Sub
Klasse beenden
Und die gleichen Werte können wie folgt abgerufen werden:
Importiert System.Runtime.Serialization.Formatters.Binary
Importiert System.IO
Öffentliche Klasse Form1
Private Sub myDeserialize_Click (_
ByVal Absender Als System.Object, _
ByVal e As System.EventArgs) _
Verarbeitet myDeserialize.Click
Dim s = New FileStream ("ParmInfo", FileMode.Open)
Dim f As New BinaryFormatter
RestoredParms als neues ParmExample dimmen
RestoredParms = f.Deserialize (s)
s.Close ()
Console.WriteLine (RestoredParms.Parm1Name)
Console.WriteLine (RestoredParms.Parm1Value)
Console.WriteLine (RestoredParms.Parm2Name)
Console.WriteLine (RestoredParms.Parm2Value)
End Sub
Klasse beenden
EIN Struktur oder eine Sammlung (wie eine Anordnungsliste) eher als ein Klasse könnte auf die gleiche Weise auch in eine Datei serialisiert werden.
Nachdem wir uns nun mit dem grundlegenden Serialisierungsprozess befasst haben, sehen wir uns auf der nächsten Seite die spezifischen Details an, die Teil des Prozesses sind.
Eines der ersten Dinge, die Sie an diesem Beispiel bemerken sollten, ist das Attribut in der Klasse. Attribute sind lediglich weitere Informationen, die Sie VB.NET zu einem Objekt bereitstellen können, und sie werden für viele verschiedene Zwecke verwendet. Das Attribut in diesem Code weist VB.NET an, zusätzlichen Code hinzuzufügen, damit später alles in dieser Klasse serialisiert werden kann.
Wenn es bestimmte Gegenstände in der Klasse gibt, die Sie nicht Wollen Sie serialisiert werden, können Sie die Attribut, um sie auszuschließen:
Public Parm3Value As String = "Whatever"
Im Beispiel ist das zu beachten Serialisieren und Deserialisieren sind Methoden der BinaryFormatter Objekt (f in diesem Beispiel).
f.Serialize (s, ParmData)
Dieses Objekt nimmt die Datenfluss Objekt und das zu serialisierende Objekt als Parameter. Wir werden sehen, dass VB.NET ein weiteres Objekt anbietet, mit dem das Ergebnis als XML ausgedrückt werden kann.
Und ein letzter Hinweis: Wenn Ihr Objekt andere untergeordnete Objekte enthält, werden diese ebenfalls serialisiert! Aber seit alle Objekte, die serialisiert werden Muss gekennzeichnet sein mit dem Attribut, alle diese untergeordneten Objekte müssen auch so markiert werden.
Um sich einen Überblick über die Vorgänge in Ihrem Programm zu verschaffen, möchten Sie möglicherweise die Datei mit dem Namen anzeigen ParmData im Editor, um zu sehen, wie serialisierte Daten aussehen. (Wenn Sie diesen Code befolgt haben, sollte er in der bin.Debug Da es sich um eine Binärdatei handelt, ist der größte Teil des Inhalts nicht lesbar, Sie sollten jedoch Zeichenfolgen in Ihrer serialisierten Datei sehen können. Wir werden als nächstes eine XML-Version erstellen. Vielleicht möchten Sie die beiden vergleichen, um den Unterschied zu erkennen.
Die Serialisierung nach XML anstelle einer Binärdatei erfordert nur wenige Änderungen. XML ist nicht so schnell und kann einige Objektinformationen nicht erfassen, aber es ist weitaus flexibler. XML kann heute von nahezu jeder anderen Softwaretechnologie auf der Welt verwendet werden. Wenn Sie sicherstellen möchten, dass Ihre Dateistrukturen Sie nicht an Microsoft binden, ist dies eine gute Option. Microsoft legt besonderen Wert auf "LINQ to XML", um XML-Datendateien mit der neuesten Technologie zu erstellen. Viele Anwender bevorzugen diese Methode jedoch weiterhin.
Das 'X' in XML steht für eXspannbar. In unserem XML-Beispiel verwenden wir eine dieser XML-Erweiterungen, eine Technologie namens SEIFE. Früher bedeutete dies "Simple Object Access Protocol", jetzt ist es nur noch ein Name. (SOAP wurde so stark aktualisiert, dass der ursprüngliche Name nicht mehr so gut passt.)
Die Hauptsache, die wir in unseren Unterprogrammen ändern müssen, ist die Deklaration des Serialisierungsformatierers. Dies muss sowohl in der Subroutine, die das Objekt serialisiert, als auch in der Subroutine, die es erneut deserialisiert, geändert werden. In der Standardkonfiguration sind drei Änderungen an Ihrem Programm erforderlich. Zunächst müssen Sie dem Projekt einen Verweis hinzufügen. Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Füge Referenz hinzu… . Stelle sicher…
System.Runtime.Serialization.Formatters.Soap
… Wurde dem Projekt hinzugefügt.
Ändern Sie dann die beiden Anweisungen in dem Programm, das darauf verweist.
Importiert System.Runtime.Serialization.Formatters.Soap
Dim f As New SoapFormatter
Dieses Mal, wenn Sie das gleiche auschecken ParmData Datei im Editor, werden Sie sehen, dass das Ganze in lesbarem XML-Text wie ...
Parm1 Name
12345
Parm2 Name
54321.12345
Dort gibt es auch viele zusätzliche XML-Dateien, die auch für den SOAP-Standard in der Datei erforderlich sind. Wenn Sie überprüfen möchten, was die Wenn das Attribut dies tut, können Sie eine Variable mit diesem Attribut hinzufügen und die Datei überprüfen, um sicherzustellen, dass sie nicht enthalten ist.
In dem Beispiel, das wir gerade codiert haben, wurden nur die Daten serialisiert. Angenommen, Sie müssen steuern, wie die Daten serialisiert werden. VB.NET kann das auch!
Um dies zu erreichen, müssen Sie etwas tiefer in das Konzept der Serialisierung einsteigen. VB.NET hat ein neues Objekt, um hier zu helfen: SerializationInfo. Obwohl Sie die Möglichkeit haben, benutzerdefiniertes Serialisierungsverhalten zu codieren, ist dies mit zusätzlichen Codierungskosten verbunden.
Das Grundlegende extra Code wird unten gezeigt. Denken Sie daran, dass diese Klasse anstelle von verwendet wird ParmExample Klasse aus dem vorherigen Beispiel. Dies ist kein vollständiges Beispiel. Der Zweck ist, Ihnen den neuen Code anzuzeigen, der für die benutzerdefinierte Serialisierung benötigt wird.
Importiert System.Runtime.Serialization
_
Public Class CustomSerialization
Implementiert ISerializable
'Daten, die hier serialisiert werden sollen
'Public SerializedVariable als Typ
Public Sub New ()
'Standardkonstruktor bei der Klasse
'wird erstellt - benutzerdefinierter Code kann sein
'fügte auch hier hinzu
End Sub
Public Sub New (_
ByVal info Als SerializationInfo, _
ByVal-Kontext als StreamingContext)
'Initialisieren Sie Ihre Programmvariablen von
'Ein serialisierter Datenspeicher
End Sub
Public Sub GetObjectData (_
ByVal info Als SerializationInfo, _
ByVal-Kontext als StreamingContext) _
Implementiert ISerializable.GetObjectData
'Aktualisieren Sie den serialisierten Datenspeicher
'aus Programmvariablen
End Sub
Klasse beenden
Die Idee ist, dass Sie jetzt können (und in der Tat, Sie Muss) alle Aktualisierungen und Lesevorgänge des serialisierten Datenspeichers im Internet durchführen Neu und GetObjectData Unterprogramme. Sie müssen auch ein Generikum hinzufügen Neu Konstruktor (keine Parameterliste), da Sie eine Schnittstelle implementieren.
Die Klasse wird normalerweise auch formale Eigenschaften und Methoden haben, die codiert sind.
Generisches Eigentum
Private newPropertyValue As String
Öffentliche Eigenschaft NewProperty () As String
Bekommen
Geben Sie newPropertyValue zurück
End Get
Festlegen (ByVal-Wert als Zeichenfolge)
newPropertyValue = value
Set beenden
Eigenschaft beenden
'Generische Methode
Public Sub MyMethod ()
'Methodencode
End Sub
Die resultierende serialisierte Klasse kann anhand des von Ihnen angegebenen Codes eindeutige Werte in der Datei erstellen. Beispielsweise könnte eine Immobilienklasse den Wert und die Adresse eines Hauses aktualisieren, aber die Klasse würde auch eine berechnete Marktklassifizierung serialisieren.
Das Neu Das Unterprogramm sieht ungefähr so aus:
Public Sub New (_
ByVal info Als SerializationInfo, _
ByVal-Kontext als StreamingContext)
'Initialisieren Sie Ihre Programmvariablen von
'Ein serialisierter Datenspeicher
Parm1Name = info.GetString ("a")
Parm1Value = info.GetInt32 ("b")
'Neues Sub geht weiter ...
Wann Deserialisieren heißt auf a BinaryFormatter Objekt wird dieses Sub ausgeführt und a SerializationInfo Objekt wird an das übergeben Neu Subroutine. New kann dann mit den serialisierten Datenwerten alles tun, was nötig ist. Beispielsweise…
MsgBox ("Dies ist Parm1Value Times Pi:" _
& (Parm1Value * Math.PI) .ToString)
Das Gegenteil passiert, wenn Serialisieren heißt, aber die BinaryFormatter Objektaufrufe GetObjectData stattdessen.
Public Sub GetObjectData (_
ByVal info Als SerializationInfo, _
ByVal-Kontext als StreamingContext) _
Implementiert ISerializable.GetObjectData
'Aktualisieren Sie den serialisierten Datenspeicher
'aus Programmvariablen
Wenn Parm2Name = "Test", dann
info.AddValue ("a", "Dies ist ein Test.")
Sonst
info.AddValue ("a", "Diesmal kein Test.")
End If
info.AddValue ("b", 2)
Beachten Sie, dass die Daten der serialisierten Datei als Name / Wert-Paare hinzugefügt werden.
Viele der Webseiten, die ich beim Schreiben dieses Artikels gefunden habe, scheinen keinen tatsächlichen Arbeitscode zu haben. Man fragt sich, ob der Autor tatsächlich Code ausgeführt hat, bevor er den Artikel schreibt.