Computerwissenschaften

Alles über die Serialisierung in Visual Basic

Bei der Serialisierung wird ein Objekt in eine lineare Folge von Bytes konvertiert, die als „Bytestrom“ bezeichnet wird. 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. 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) … was auch immer Sie benötigen machen.

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 Visual Basic ein so wichtiger Prozess . Im Folgenden finden Sie einen Abschnitt über benutzerdefinierte Serialisierung durch die Implementierung ISerializable – Schnittstelle und eine Codierung Neu und eine GetObjectData Unterprogramm.

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 … gut … strukturiert zu halten.

Modul SerializeParms
Öffentliche Klasse ParmExample
   Public Parm1Name As String=“Parm1 Name“
   Public Parm1Value As Integer=12345
   Public Parm2Name As String
   Public Parm2Value As Decimal
End Class
End Module

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

Importiert System.Runtime.Serialization.Formatters.Binary
Imports System.IO
Öffentliche Klasse Form1
   Private Sub mySerialize_Click (_
  ByVal-Absender als System.Object, _
  ByVal e als System.EventArgs) _
  Behandelt mySerialize.Click
  Dim ParmData As New ParmExample
  ParmData.Parm2ame=“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
End Class

Dieselben Werte können folgendermaßen abgerufen werden:

Importiert System.Runtime.Serialization.Formatters.Binary
Imports System.IO
Öffentliche Klasse Form1
   Private Sub myDeserialize_Click (_
  ByVal-Absender als System.Object, _
  ByVal e als System.EventArgs) _
  Behandelt myDeserialize.Click
  Dim s=New FileStream („ParmInfo“FileMode.Open)
  Dim f As New BinaryFormatter
  Dim RestoredParms As New ParmExample
  RestoredParms=f.Deserialize (s)
  S.CLOSE ()
  Console.WriteLine (RestoredParms.Parm1Name)
  Console.WriteLine (RestoredParms.Parm1Value)
  Console.WriteLine (RestoredParms .Parm2Name)
  Console.WriteLine (RestoredParms.Parm2Value)
   End Sub
End Class

Eine Struktur oder eine Sammlung (z. B. eine ArrayList. anstelle einer Klasse kann auf dieselbe 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 bei 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 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 die Klasse bestimmte Elemente enthält, die nicht serialisiert werden sollen, können Sie sie mit dem Attribut ausschließen:

Public Parm3Value As String=“Was auch immer“

Im Beispiel ist zu beachten, dass Serialize und Deserialize Methoden des BinaryFormatter- Objekts sind ( in diesem Beispiel f ).

f.Serialize (s, ParmData)

Dieses Objekt verwendet das FileStream- 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 da alle Objekte , die serialisiert werden müssen mit dem markiert Attribut, alle diese untergeordneten Objekte müssen auch so gekennzeichnet sein.

Um ganz klar zu sein, was in Ihrem Programm passiert, möchten Sie möglicherweise die Datei ParmData im Editor anzeigen, um zu sehen, wie serialisierte Daten aussehen. (Wenn Sie diesem Code gefolgt sind, sollte er sich im Ordner bin.Debug in Ihrem Projekt befinden.) Da es sich um eine Binärdatei handelt, ist der größte Teil des Inhalts nicht lesbarer Text, aber Sie sollten in der Lage sein, alle Zeichenfolgen in Ihrer serialisierten Datei zu sehen Datei. Als nächstes werden wir 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 e X Tensible. In unserem XML-Beispiel verwenden wir eine dieser XML-Erweiterungen, eine Technologie namens SOAP . 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. Rechtsklick auf das Projekt und wählen Sie Verweis hinzufügen … . Vergewissere dich …

System.Runtime.Serialization.Formatters.Soap

… wurde dem Projekt hinzugefügt.

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

Importiert System.Runtime.Serialization.Formatters.Soap

Dim f As New SoapFormatter

Wenn Sie diesmal dieselbe ParmData- Datei im Editor auschecken , werden Sie feststellen , dass sich das Ganze in lesbarem XML-Text befindet, z.

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 das Attribut bewirkt, 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 die Möglichkeit haben, benutzerdefiniertes Serialisierungsverhalten zu codieren, fallen zusätzliche Codierungskosten an.

Der grundlegende zusätzliche Code wird unten gezeigt. Denken Sie daran, dass diese Klasse anstelle der im vorherigen Beispiel gezeigten ParmExample- Klasse verwendet wird. 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 System.Runtime.Serialization
_
Öffentliche Klasse CustomSerialization
   Implementiert ISerializable
   ‚Daten, die hier serialisiert werden sollen
   ‚ Public SerializedVariable als Typ
   Public Sub New ()
   ‚Standardkonstruktor beim Erstellen der Klasse
   ‚ – hier kann benutzerdefinierter Code
   hinzugefügt werden Auch
   End Sub
   Public Sub Neu (_
  ByVal-Informationen als SerializationInfo, _
  ByVal-Kontext als StreamingContext)
  ‚Initialisieren Sie Ihre Programmvariablen aus
  ‚ einem serialisierten Datenspeicher
   End Sub
   Public Sub GetObjectData (_
  ByVal-Informationen als SerializationInfo, _
  ByVal-Kontext als StreamingContext) _
  Implementiert ISerializable.GetObjectData
  ‚Aktualisieren des serialisierten Datenspeichers
  ‚ aus den Programmvariablen
   End Sub
End Class

Die Idee ist, dass Sie jetzt alle Aktualisierungen und das Lesen von Daten im serialisierten Datenspeicher in den Unterroutinen New und GetObjectData durchführen können (und müssen ) . Sie müssen auch einen generischen neuen Konstruktor (keine Parameterliste) einschließen, da Sie eine Schnittstelle implementieren.

Die Klasse hat normalerweise auch formale Eigenschaften und Methoden …

‚Generische Eigenschaft
Private newPropertyValue als Zeichenfolge
Öffentliche Eigenschaft NewProperty () als   Zeichenfolge
   Get
Return newPropertyValue
   End Get
   Set (ByVal-Wert als
  Zeichenfolge ) newPropertyValue=Wert
   End Set
End-Eigenschaft

‚ 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 neue Unterprogramm sieht ungefähr so ​​aus:

Public Sub New (_
   ByVal info As SerializationInfo, _
   ByVal context As StreamingContext)
   ‚initialisieren Sie Ihre Programmvariablen aus
   ‚ einem serialisierten Datenspeicher
   Parm1Name=info.GetString („a“)
   Parm1Value=info.GetInt32 („b“)
   ‚New sub geht weiter …

Wenn Deserialize für ein BinaryFormatter- Objekt aufgerufen wird, wird dieses Sub ausgeführt und ein SerializationInfo- Objekt an die New- Subroutine übergeben. 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 Serialize aufgerufen wird, das BinaryFormatter- Objekt jedoch stattdessen GetObjectData aufruft .

Public Sub GetObjectData (_
   ByVal-Informationen als SerializationInfo, _
   ByVal-Kontext als StreamingContext) _
   Implementiert ISerializable.GetObjectData
   ‚Aktualisieren des serialisierten Datenspeichers
   ‚ aus Programmvariablen
   Wenn Parm2Name=“Test“, dann
  info.AddValue („a“, „Dies ist ein Test. „)
   Else
  info.AddValue (“ a“, „Kein Test dieser Zeit.“)
   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 geschrieben hat. 

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.