Alles über das Serialisieren in Visual Basic

click fraud protection

Bei der Serialisierung wird ein Objekt in eine lineare Folge von konvertiert Bytes ein "Byte-Stream" genannt. Die Deserialisierung kehrt den Prozess nur um. Aber warum sollten Sie ein Objekt in einen Bytestream 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. Sie können also Bilder, Datendateien und den aktuellen Status eines Programmmoduls serialisieren ('state' ist wie a Momentaufnahme Ihres Programms zu einem bestimmten Zeitpunkt, sodass Sie die Ausführung vorübergehend unterbrechen und erneut starten können später)... was auch immer Sie tun müssen.

Sie können diese Objekte auch in Dateien auf der Festplatte speichern, über das Internet 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

instagram viewer
Visual Basic. Unten finden Sie einen Abschnitt zur benutzerdefinierten Serialisierung durch Implementierung von ISerialisierbar Schnittstelle und Codierung a Neu und ein GetObjectDataSubroutine.

Lassen Sie uns als erstes Beispiel für die Serialisierung eines der einfachsten, aber auch eines der nützlichsten Programme ausführen: Serialisieren von Daten und anschließendes Deserialisieren von Daten in einfachen Klassen zu und von einer Datei. In diesem Beispiel werden die Daten nicht nur serialisiert, sondern auch die Struktur der Daten gespeichert. Die Struktur hier wird in einem Modul deklariert, um die Dinge zu behalten... Gut... strukturiert.

Modul SerializeParms
ParmExample der öffentlichen Klasse
Öffentlicher Parm1Name As String = "Parm1 Name"
Öffentlicher Parm1Value As Integer = 12345
Öffentlicher Parm2Name als Zeichenfolge
Öffentlicher Parm2-Wert als Dezimalzahl
Klasse beenden
Modul beenden

Anschließend können einzelne Werte in einer Datei wie folgt gespeichert werden:

Importiert das System. Laufzeit. Serialisierung. Formatierer. Binär
Importiert das System. IO
Öffentliche Klasse Form1
Private Sub mySerialize_Click (_
ByVal Absender als System. Objekt, _
ByVal e As System. EventArgs) _
Behandelt mySerialize. Klicken
Dim ParmData As New ParmExample
ParmData. Parm2Name = "Parm2 Name"
ParmData. Parm2Value = 54321.12345
Dim s As New FileStream ("ParmInfo", FileMode. Erstellen)
Dim f As New BinaryFormatter
f. Serialize (s, ParmData)
s. Schließen()
End Sub
Klasse beenden

Dieselben Werte können folgendermaßen abgerufen werden:

Importiert das System. Laufzeit. Serialisierung. Formatierer. Binär
Importiert das System. IO
Öffentliche Klasse Form1
Private Sub myDeserialize_Click (_
ByVal Absender als System. Objekt, _
ByVal e As System. EventArgs) _
Behandelt myDeserialize. Klicken
Dim s = Neuer FileStream ("ParmInfo", FileMode. Öffnen)
Dim f As New BinaryFormatter
Dim RestoredParms als neues Parm-Beispiel
RestoredParms = f. Deserialize (s)
s. Schließen()
Konsole. WriteLine (RestoredParms. Parm1Name)
Konsole. WriteLine (RestoredParms. Parm1Value)
Konsole. WriteLine (RestoredParms. Parm2Name)
Konsole. 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 den grundlegenden Serialisierungsprozess durchgearbeitet 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 beachten sollten, ist das Attribut in der Klasse. Attribute sind nur weitere Informationen, die Sie VB.NET über ein Objekt zur Verfügung stellen können und die für viele verschiedene Zwecke verwendet werden. 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 Elemente in der Klasse gibt, die Sie nicht Wenn Sie serialisiert werden möchten, können Sie die verwenden Attribut, um sie auszuschließen:

Public Parm3Value As String = "Was auch immer"

Im Beispiel ist dies 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 bietet, mit dem das Ergebnis als XML ausgedrückt werden kann.

Und eine letzte Anmerkung: Wenn Ihr Objekt andere untergeordnete Objekte enthält, werden diese ebenfalls serialisiert! Aber seit alle Objekte, die serialisiert sind Muss mit dem gekennzeichnet sein Attribut, alle diese untergeordneten Objekte müssen auch so markiert werden.

Um ganz klar zu sein, was in Ihrem Programm passiert, möchten Sie möglicherweise die Datei mit dem Namen anzeigen ParmData im Editor, um zu sehen, wie serialisierte Daten aussehen. (Wenn Sie diesem Code gefolgt sind, sollte er in der Behälter. Debuggen Ordner in Ihrem Projekt.) Da es sich um eine Binärdatei handelt, ist der größte Teil des Inhalts kein lesbarer Text, aber Sie sollten in der Lage sein, alle Zeichenfolgen in Ihrer serialisierten Datei zu sehen. Wir werden als nächstes eine XML-Version erstellen und Sie möchten möglicherweise die beiden vergleichen, um sich des Unterschieds bewusst zu werden.

Die Serialisierung in XML anstelle einer Binärdatei erfordert nur sehr wenige Änderungen. XML ist nicht so schnell und kann einige Objektinformationen nicht erfassen, ist jedoch weitaus flexibler. XML kann heutzutage von nahezu jeder anderen Softwaretechnologie auf der Welt verwendet werden. Wenn Sie sicher sein möchten, dass Ihre Dateistrukturen Sie nicht an Microsoft "binden", ist dies eine gute Option. Microsoft betont "LINQ to XML", um XML-Datendateien in der neuesten Technologie zu erstellen, aber viele Menschen bevorzugen diese Methode immer noch.

Das 'X' in XML steht für eX.spannbar. In unserem XML-Beispiel verwenden wir eine dieser Erweiterungen von XML, 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 geändert werden, die das Objekt serialisiert, als auch in der Subroutine, die es erneut deserialisiert. Bei 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. Laufzeit. Serialisierung. Formatierer. Seife

... wurde dem Projekt hinzugefügt.

Ändern Sie dann die beiden Anweisungen im Programm, das darauf verweist.

Importiert das System. Laufzeit. Serialisierung. Formatierer. Seife
Dim f As New SoapFormatter

Diesmal, 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

Es gibt dort auch viele zusätzliche XML-Dateien, die für den SOAP-Standard in der Datei erforderlich sind. Wenn Sie überprüfen möchten, was die Mit diesem Attribut können Sie eine Variable mit diesem Attribut hinzufügen und anhand der Datei überprüfen, ob 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 das Konzept der Serialisierung etwas vertiefen. VB.NET hat hier ein neues Objekt, das Ihnen helfen kann: SerializationInfo. Obwohl Sie das benutzerdefinierte Serialisierungsverhalten codieren können, fallen zusätzliche Codierungskosten an.

Das Grundlegende extra Code wird unten gezeigt. Denken Sie daran, dass diese Klasse anstelle von verwendet wird ParmExample Klasse im vorherigen Beispiel gezeigt. Dies ist kein vollständiges Beispiel. Der Zweck besteht darin, Ihnen den neuen Code anzuzeigen, der für die benutzerdefinierte Serialisierung benötigt wird.

Importiert das System. Laufzeit. Serialisierung
_
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
'auch hier hinzugefügt
End Sub
Public Sub Neu (_
ByVal info As SerializationInfo, _
ByVal-Kontext als StreamingContext)
'Initialisieren Sie Ihre Programmvariablen von
'ein serialisierter Datenspeicher
End Sub
Public Sub GetObjectData (_
ByVal info As 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 das Lesen von Daten im serialisierten Datenspeicher in der Neu und GetObjectData Unterprogramme. Sie müssen auch ein Generikum einschließen Neu Konstruktor (keine Parameterliste), da Sie eine Schnittstelle implementieren.

Die Klasse hat normalerweise auch formale Eigenschaften und Methoden ...

'Generisches Eigentum
Private newPropertyValue As String
Öffentliches Eigentum NewProperty () As String
Bekommen
Geben Sie newPropertyValue zurück
End Get
Set (ByVal-Wert als Zeichenfolge)
newPropertyValue = Wert
End Set
Endeigenschaft
'Generische Methode
Public Sub MyMethod ()
'Methodencode
End Sub

Die resultierende serialisierte Klasse kann basierend auf dem von Ihnen angegebenen Code 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 Neu (_
ByVal info As SerializationInfo, _
ByVal-Kontext als StreamingContext)
'Initialisieren Sie Ihre Programmvariablen von
'ein serialisierter Datenspeicher
Parm1Name = info. GetString ("a")
Parm1Value = info. GetInt32 ("b")
'Neues U-Boot geht weiter ...

Wann Deserialisieren wird auf a gerufen BinaryFormatter Objekt wird dieses Sub ausgeführt und a SerializationInfo Objekt wird an die übergeben Neu Subroutine. New kann dann mit den serialisierten Datenwerten alles Notwendige tun. Zum Beispiel ...

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 As SerializationInfo, _
ByVal-Kontext als StreamingContext) _
Implementiert ISerializable. GetObjectData
'Aktualisieren Sie den serialisierten Datenspeicher
'aus Programmvariablen
Wenn Parm2Name = "Test" Dann
die Info. AddValue ("a", "Dies ist ein Test.")
Sonst
die Info. AddValue ("a", "Diesmal kein Test.")
End If
die 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 geschrieben hat.

instagram story viewer