Das Speicherformat von Daten wird oft in ein für Schreib- und Lesevorgänge geeigneteres Format umgewandelt. Diese Umwandlung wird Serialisierung genannt.

Da Strings, Arrays und Pfade in Handles gespeichert werden (also Zeiger auf Zeiger in separaten Bereichen des Speichers), sind Cluster mit diesen Strings und Arrays nicht homogen. Meist werden LabVIEW-Daten in Form einer Baumstruktur gespeichert. So wird zum Beispiel ein Cluster in Form einer Fließkommazahl mit doppelter Genauigkeit und eines Strings als 8-Byte-Fließkommazahl, gefolgt von einem 4-Byte-Handle auf den String, gespeichert. Der Inhalt des Strings wird also nicht direkt neben der Fließkommazahl im Speicher abgelegt. Daher müssen Cluster-Daten beim Speichern auf die Festplatte von zwei verschiedenen Orten im Arbeitsspeicher abgerufen werden. Enthält ein Cluster viele Strings, Arrays oder Pfade, so speichert LabVIEW die Daten an verschiedenen Orten.

Beim Speichern von Daten in einer Datei serialisiert LabVIEW die Daten, konvertiert sie also in einen einzigen String. Durch die Serialisierung werden die Daten zusammenhängend und nicht an verschiedenen Orten gespeichert. Wenn LabVIEW Daten aus einer Datei lädt, muss die umgekehrte Operation durchgeführt werden – ein einzelner String muss gelesen und in seine interne, möglicherweise nicht homogene Form deserialisiert werden.

Die serialisierten Daten werden außerdem in eine Standardform gebracht (normalisiert), so dass VIs die Daten plattformunabhängig nutzen können. Serialisierte Zahlen werden im Big-Endian-Format (höchstwertiges Byte zuerst) und serialisierte Fließkommazahlen mit erweiterter Genauigkeit im 16-Byte-Format gespeichert.

Werden Daten in eine Datei gespeichert, damit sie von einer nicht mit LabVIEW erstellten Anwendung genutzt werden können, oder werden Daten aus einer Datei geladen, die von einer fremden Anwendung erzeugt wurde, können die Daten nach der Serialisierung oder vor der Deserialisierung in das Little-Endian-Format (niedrigstwertiges Byte zuerst) oder das Big-Endian-Format umgewandelt werden. Auf Windows basierende Anwendungen erwarten Daten üblicherweise im Little-Endian-Format.

Verwenden Sie zur Serialisierung bzw. Deserialisierung von Daten die Funktionen Daten serialisieren und String deserialisieren, die in ihrer Funktionsweise genau den internen Vorgängen beim Speichern und Laden von Daten in LabVIEW entsprechen.

In der serialisierten Form ist der Datentyp nicht in verschlüsselter Form enthalten. Stattdessen wird diese Angabe in einem Typdeskriptor mitgeliefert. Für die Funktion "String deserialisieren" muss ein Datentyp angegeben werden, so dass die Funktion den String entschlüsseln kann.

Mit dem Variant-Datentyp können Sie datentypunabhängig mit Daten arbeiten und müssen die Daten beim Laden und Speichern nicht extra serialisieren bzw. deserialisieren. Erzeugt und verarbeitet werden Variantdaten mit den Variantfunktionen.

Hinweis Bei Anwendung der Funktion "Daten serialisieren" auf Variantdaten serialisiert LabVIEW den gesamten Inhalt des Variants einschließlich der Attribute. Wenn Sie die Funktion "Variant nach serialisierte Daten" verwenden, serialisiert LabVIEW nur den Variant und verwirft alle Attribute.

Boolesche und numerische Objekte

Serialisierte boolesche und numerische Werte werden grundsätzlich im Big-Endian-Format gespeichert. Ein 32-Bit-Integer mit dem Wert –19 wird beispielsweise in FFFF FFED serialisiert. Eine Fließkommazahl doppelter Genauigkeit mit dem Wert 1/4 wird in 3FD0 0000 0000 0000 serialisiert. Jeder Wert außer 0 entspricht dem booleschen Wert TRUE. Der boolesche Wert FALSE entspricht 00.

Serialisierte Fließkommazahlen mit erweiterter Genauigkeit werden im entsprechenden 128-Bit-Format dargestellt. Zahlen mit erweiterter Genauigkeit werden in diesem Format auf der Festplatte gespeichert.

Strings und Pfade

Da Strings und Pfade unterschiedlich groß sein können, wird vor dem serialisierten Format ein serialisierter 32-Bit-Integer eingefügt, der die entsprechende Länge in Byte angibt. So wird beispielsweise der String "ABC" in 0000 0003 4142 43 serialisiert. Bei Strings ähnelt das serialisierte Format dem Format, das die Strings im Arbeitsspeicher haben.

Pfaden wird dagegen beim Speichern in den Arbeitsspeicher keine Längenangabe vorangestellt. Dieser Wert ergibt sich also aus der tatsächlichen Größe der Daten im Speicher und wird dem Wert bei der Serialisierung der Daten vorangestellt. Vor der Länge werden die Zeichen PTH0 eingefügt.

Der Pfad C:\File wird beispielsweise in 5054 4830 0000 000B 0000 0002 0143 0466 696C 65 serialisiert.

5054 4830 entspricht dabei PTH0. 0000 000B zeigt an, dass es insgesamt 11 Bytes gibt. 0000 steht für den Typ. 0002 ist die Anzahl der Pfadbestandteile. 0143 steht für den Buchstaben C als Pascal-String. 0466 696C 65 kennzeichnet das Wort File als Pascal-String.

Arrays

Den Daten eines serialisierten Arrays gehen serialisierte 32-Bit-Integer voraus, die die Dimensionsanzahl des Arrays in Elementen angeben. Zuerst kommt die sich am langsamsten verändernde Dimension. Dann folgen nacheinander die sich schneller verändernden Dimensionen. Dies entspricht der Reihenfolge der Dimensionsgrößen im Speicher. Dann folgen die serialisierten Daten in der Reihenfolge, in der sie gespeichert wurden. Im folgenden Beispiel sehen Sie ein 2D-Array aus sechs 8-Bit-Integern.

{ {1, 2, 3}, {4, 5, 6} } hat serialisiert die Form 0000 0002 0000 0003 0102 0304 0506.

Im folgenden Beispiel sehen Sie ein serialisiertes 1D-Array aus booleschen Variablen.

{T, F, T, T} hat serialisiert die Form 0000 0004 0100 0101. Der bevorzugte Wert für TRUE ist 01.

Cluster

Ein serialisierter Cluster wird durch Serialisierung seiner Elemente entsprechend ihrer Reihenfolge im Cluster erzeugt. So hat beispielsweise ein serialisierter Cluster mit dem 16-Bit-Integer 4 (dezimal) und dem 32-Bit-Integer 12 die Form 0004 0000 000C.

Ein serialisierter Cluster mit dem String ABC und dem 16-Bit-Integer 4 hat die Form 0000 0003 4142 4300 04.

Ein serialisierter Cluster, der aus dem 16-Bit-Integer 7 sowie einem Cluster aus dem 16-Bit-Integer 8 und dem 16-Bit-Integer 9 besteht, wird zu 0007 0008 0009.

Signalverläufe

Signalverläufe werden genau wie Cluster serialisiert.

Referenzen

Die meisten Referenzen werden in serialisierte 32-Bit-Integer umgewandelt, was der LabVIEW-internen Datenstruktur entspricht.

Die übrigen Referenzen können anhand ihrer Typcodes unterteilt werden.

Die Typcodes 0xE, 0xF und 0x15 sind Referenzen, deren Daten als serialisierte Strings gespeichert werden. Dieser String enthält den Wert des Referenz-Tags. Der String kann auch leer sein (vier Null-Bytes).

Die Typcodes 0x1A, 0X1C und 0x1D werden in folgender Reihenfolge verkettet:

  1. Ein serialisierter String für den Namen im Referenz-Tag. Dieser String ist leer (vier Null-Bytes), wenn die Referenz kein Tag hat.
  2. Ein serialisierter String mit Angaben zur Referenz. Dieser String kann leer sein (vier Null-Bytes).
  3. Ein serialisierter String mit Angaben zur Referenz. Dieser String kann leer sein (vier Null-Bytes).
  4. Ein serialisierter 32-Bit-Integer-Wert mit Vorzeichen, der Angaben zur Referenz enthält.
  5. Ein serialisierter String mit Angaben zur Referenz. Dieser String kann leer sein (vier Null-Bytes).

Klassen

LabVIEW serialisiert eine LabVIEW-Klasse entsprechend dem folgenden allgemeinen Format:

Ebene in der Hierarchie Klassenname Versionsliste Privatdaten
  • Ebene in der Hierarchie—4-Byte-Integer ohne Vorzeichen geben die Ebene der Klasse in der Klassenhierarchie an. Wenn dieser Wert z. B. 2 ist, hat die Klasse eine Vorgängerklasse zwischen sich und dem LabVIEW-Objekt.
    Hinweis Wenn die Ebene in der Hierarchie 0 lautet, ist das Objekt ein Exemplar eines LabVIEW-Objekts, und LabVIEW schließt die übrigen drei Felder vom String aus.
  • Klassenname—Eine Folge aus Pascal-Strings mit einem vorangestellten Byte, das die Länge des qualifizierten Klassennamens angibt. Jeder Pascal-String oder jede Byte-Folge, in der das erste Byte die Länge des Strings angibt und die übrigen Bytes den String-Text ausmachen, stellen ein Segment des qualifizierten Namens dar. Der letzte Pacal-String ist ein Längen-Byte von 0. Dieser Abschnitt des serialisierten Strings enthält ausreichend Füll-Bytes zur Ausdehnung des Abschnitts für den Klassennamen auf ein Vielfaches von vier Bytes.
  • Versionsliste—Eine Folge von Clustern, in denen jeder Cluster aus vier vorzeichenlosen 2-Byte-Integern besteht, die eine Versionsnummer darstellen. Der erste Cluster in dieser Liste steht für die Version des Klassennamens. Die zweite Zahl ist die Version der übergeordneten Klasse usw. Diese Liste enthält eine Versionsnummer für jede Ebene in der Hierachie.
    Hinweis Wenn die Ebene in der Hierarchie 1 und die Version 0 ist, sind die serialisierten Daten die Standarddaten der Klasse, und LabVIEW schließt das übrige Feld vom String aus.
  • Privatdaten—Eine Folge von serialisierten Clustern zur Darstellung der Privatdaten jeder Ebene in der Hierarchie. In umgekehrter Reihenfolge der Versionsliste entspricht der erste Cluster in dieser Reihe der ältesten Vorgängerklasse. Jeder serialisierte Cluster beginnt mit einem 4-Byte-Integer mit Vorzeichen, der für die Anzahl der Bytes in den nachfolgenden Daten steht. Wenn diese Zahl anfänglich 0 ist, stellt der serialisierte Cluster die Standarddaten der entsprechenden Klasse in der Hierarchie dar. Anderenfalls verwenden die folgenden Daten die serialisierten Standard-Cluster, von denen bereits gesprochen wurde. Jeder serialisierte Cluster endet mit ausreichend Füll-Bytes zur Ausweitung des Clusters auf ein Vielfaches von vier Bytes.