Leitfaden zur C ++ - Serialisierung

Leitfaden zur C ++ - Serialisierung
Die Serialisierung wandelt ein Objekt in einen Strom von Bytes um. Es gibt zwei Arten von Objekten in C ++: grundlegende Objekte und Objekte, die aus einer definierten Klasse instanziiert sind. Hinweis, in C ++ wird die Struktur als Klasse angesehen, und der Name einer Struktur repräsentiert das instanziierte Objekt der Struktur.

Einzelne grundlegende Objekte sind normalerweise nicht serialisiert. Da jedoch ein instanziiertes Objekt grundlegende Objekte hat, wie das gesamte Objekt serialisiert ist, sind die grundlegenden Objekte ebenfalls serialisiert. In C ++ sind alle Datenstrukturen wie der Vektor vordefinierte Klassen.

Serialisierung wird auch als Marschall bezeichnet. Das Gegenteil von Serialisierung ist Deserialisierung oder Unmarshalle. Das serialisierte Objekt als Datei von der Festplatte oder das Netzwerk kann zurück in das Objekt am lokalen Computer konvertiert werden, um mit der lokalen C ++ - Anwendung (Programm) zu verwendet werden.

Dieser Artikel leitet Sie dazu, die C ++ - Serialisierungsbibliotheken besser zu verstehen und Ihre eigene Serialisierungsbibliothek zu schreiben. Es konzentriert sich auf den serialisierten Standardstrom, JSON - siehe unten.

Artikelinhalt

  • Binär- und Textstrom
  • Hauptziele
  • JSON Stream
  • JSON -Syntax
  • JSON -Datenwert
  • Vergleich von C ++ - und JSON -Objekten
  • Mehr zu wissen
  • Abschluss

Binär- und Textstrom

Binär
Ein kompiliertes C ++ - Programm soll in binärer Form sein. Ein serialisierter Strom kann in binärer Form sein. Dieser Artikel berücksichtigt jedoch keine binären serialisierten Objekte.

Text
Der serialisierte Strom kann in Textform erfolgen. Zwei Textstandards, die heute verwendet werden, sind JSON und XML. Es ist einfacher, JSON zu verstehen und umzugehen, als XML zu verstehen und zu bewältigen. Also wird JSON in diesem Artikel verwendet.

Hauptziele

Die Hauptziele für die Serialisierung sind, dass der serialisierte Strom rückwärts kompatibel und nach vorne kompatibel sein sollte. Es sollte auch möglich sein, in verschiedenen Betriebssystemen und in verschiedenen Computerarchitekturen eingesetzt zu werden.

Ausführung
Angenommen, Sie haben ein Programm geschrieben und an einen Kunden versendet, und der Kunde ist zufrieden. Das ist gut. Später braucht der Kunde eine Änderung. Heute hat der Kunde seinen eigenen Programmierer beschäftigt. Der Programmierer fordert Sie auf, einer Klasse eine andere Eigenschaft (Datenmitglied) hinzuzufügen und die entsprechenden Ziele über das Netzwerk zu senden. Er beabsichtigt, das Objekt in das Programm einzubeziehen; Wenn Sie das tun, muss der serialisierte Strom mit dem alten Objekt rückwärts kompatibel sein.

Die Spezifikation von C ++ und anderen Sprachen ändern sich im Laufe der Zeit. In einigen Spezifikationen werden Sie über einige der Änderungen informiert, die in den nächsten und zukünftigen Spezifikationen stattfinden werden. Normalerweise ist es nicht möglich, Sie über alle Änderungen zu informieren, die stattfinden werden. Daher sollte Ihr serialisierter Stream vorwärts kompatibel sein, solange diese neuen zukünftigen Änderungen betroffen sind. Die Vorwärtskompatibilität hat seine Grenzen, da nicht alle zukünftigen Änderungen bestimmt werden können.

Sowohl die Vorwärts- als auch die Rückwärtskompatibilität werden durch das Schema namens Versioning behandelt.

JSON Stream

JSON steht für JavaScript -Objektnotation.

JSON ist ein Textformat zum Speichern und Transport von Daten.

JSON ist "Selbstbeschreibung".

JSON ist auch ein alter Standard und passt daher gut für C ++ Text -Serialisierung und -Deserialisierung. Um ein C ++ - instantiertes Objekt zu senden, konvertieren Sie es in ein JSON -Objekt und senden Sie es. Kurz bevor das JSON -Objekt gesendet wird, wird es als Stream bezeichnet. Wenn ein JSON -Objekt in seiner Reihenfolge empfangen wird, wird es immer noch als Stream für die Deserialisierung bezeichnet.

JSON -Syntax

Mit JSON ist ein Datum ein Schlüssel-/Wertpaar. Zum Beispiel in

"Name": "Smith"

Name ist ein Schlüssel, und Smith ist der Wert. Ein Objekt wird durch Zahnspangen abgegrenzt, wie in:

"Name": "Smith", "Höhe": 1.7

Die Daten werden durch Kommas getrennt. Jeder Text, ob es sich um einen Schlüssel oder ein Wert handelt, muss sich in doppelten Quoten befinden. Nummern werden ohne Zitate geschrieben.

Ein Array wird von quadratischen Klammern wie in:

["Orange", "Banane", "Birne", "Zitrone"]

Im folgenden Code gibt es ein Datum, dessen Wert ein Array ist und durch arr identifiziert wird

"arr": ["Orange", "Banane", "Birne", "Zitrone"]

Hinweis: Objekte können in JSON verschachtelt werden, und damit können Objekte identifiziert werden.

JSON -Datenwert

Möglicher JSON -Datenwert ist:

  • ein Faden
  • eine Zahl
  • ein Objekt
  • eine Anordnung
  • ein Boolescher
  • Null
  • eine Funktion (aber in Doppelquoten)

Ein C ++ - Datum oder ein anderes Objekt, das nicht in dieser Liste in eine wörtliche Zeichenfolge umgewandelt werden muss, um ein JSON -Wert zu werden.

Vergleich von C ++ - und JSON -Objekten

Das Folgende ist ein einfaches C ++ - Programm mit einem einfachen Objekt des Standardkonstruktors:

#enthalten
Verwenden von Namespace STD;
Klasse Thecla

öffentlich:
int num;
int mthd (int it)

Gib es zurück;

;
int main ()

Thecla obj;
int no = obj.mthd (3);
Cout << no << endl;
Rückkehr 0;

Das äquivalente JSON -Objekt lautet wie folgt:

"obj": "num": null, "mthd": "int mthd (int it) return it;"

Ein JSON -Objekt ist per Definition serialisiert.

Beachten Sie, wie der Name des Objekts angezeigt wurde. Beachten Sie auch, wie der Name der Funktion angezeigt wurde. Am Empfangsende muss das C ++ - Programm dort zur Deserialisierung dort in eine C ++ - Klasse und Objekt umwandeln und dann kompilieren. Das Programm muss auch die Funktion in Stringform erkennen, die Doppelzitate entfernen und die Funktion als Text vor dem Kompilieren haben.

Um dies zu erleichtern, sollte Metadaten gesendet werden. Metadaten sind Daten über Daten. Eine C ++ - Karte mit den Metadaten kann gesendet werden. Eine Karte ist ein C ++ - Objekt selbst, das in ein JSON -Objekt konvertiert werden muss. Es wird gesendet, gefolgt vom Interesse des JSON -Objekts.

Das JSON -Objekt ist ein Stream -Objekt. Nachdem es vorbereitet wurde, sollte es an das C ++ - Ostream -Objekt gesendet werden, das als Datei gespeichert oder über das Netzwerk gesendet werden soll. Auf dem empfangenden Computer empfängt der C ++ - Iststream die Sequenz. Es wird dann vom Deserialisierungsprogramm übernommen, das das Objekt im C ++ - Format reproduziert. Ostream und iStream sind Objekte von C ++ Fstream.

Hinweis: In JavaScript (ECMascript) wird die Serialisierung aufgerufen, String- und Deserialisierung wird als Parsen bezeichnet.

JSON -Objekt und JavaScript -Objekt

JSON -Objekt und JavaScript -Objekt sind ähnlich. JavaScript -Objekt hat weniger Einschränkungen als JSON -Objekt. JSON -Objekt wurde aus dem JavaScript -Objekt entworfen, aber heute kann es von vielen anderen Computersprachen verwendet werden. JSON ist das häufigste Archiv (serialisierte Sequenz), mit dem Daten zwischen den Webservern und ihren Clients gesendet werden. C ++ - Bibliotheken verwenden JSON, aber keiner von ihnen befriedigt die meisten Ziele, ein Archiv für C zu produzieren++.

Hinweis: In JavaScript ist eine Funktion keine Zeichenfolge. Jede als Zeichenfolge empfangene Funktion wird in eine normale Syntaxfunktion umgewandelt.

Mehr zu wissen

Um das oben genannte zu kennen, müssen Sie auch wissen:

  • wie man C ++-Zeiger zu Objekten im JSON-Format ausdrückt;
  • wie man die C ++ - Vererbung im JSON -Format ausdrückt;
  • wie man C ++ Polymorphismus im JSON -Format ausdrückt; Und
  • Mehr über JSON.

Abschluss

Die Serialisierung wandelt ein Objekt in einen Strom von Bytes um. Die Deserialisierung ist der umgekehrte Prozess für den serialisierten Strom, der als Archiv bezeichnet wird.

Sowohl grundlegende Objekte als auch instanziierte Objekte können serialisiert werden. Einzelne grundlegende Objekte sind kaum serialisiert. Da jedoch ein instanziiertes Objekt grundlegende Objekte hat, werden grundlegende Objekte neben dem Ganzen serialisiert.

Die Serialisierung hat einen Nachteil, dass sie private Mitglieder des C ++ - Objekts enthüllt. Dieses Problem kann durch Serialisierung in binär behoben werden. Mit Text kann Metadaten gesendet werden, um die privaten Mitglieder anzuzeigen. Aber der Programmierer am anderen Ende kann die privaten Mitglieder immer noch kennen.

Möglicherweise haben Sie bereits auf der Festplatte gespeichert oder ein Binär- oder Quellcodeprogramm über die E -Mail gesendet, und Sie fragen sich vielleicht: Warum speichern oder nur das Objekt senden oder senden. In C ++ haben Sie vielleicht erkannt, dass eine ganze Bibliothek nur aus einer Klasse bestehen kann, möglicherweise mit etwas Erbschaft. Die Klasse ist möglicherweise länger als viele kurze C ++ - Programme. Ein Grund für das Senden von Objekten ist also, dass einige Objekte zu groß sind. Objektorientierte Programmierung (OOP) beinhaltet die Wechselwirkung von Objekten, ähnlich wie Tiere, Pflanzen und Werkzeuge interagieren. Ein weiterer Grund ist, dass sich OOP verbessert und Programmierer es vorziehen, mit Objekten zu befassen als die gesamte Anwendung, die möglicherweise zu groß sein kann.

C ++ hat noch kein Standard -Archivformat für Text oder binär, obwohl es Serialisierungsbibliotheken für C ++ - Serialisierung und Deserialisierung gibt. Keiner von ihnen ist wirklich zufriedenstellend. Das Textarchivformat für JavaScript ist JSON. JSON kann mit jeder Computersprache verwendet werden. Mit der obigen Anleitung sollten Sie also in der Lage sein, eine eigene Bibliothek für C ++ - Marschalling und Unmarshalling zu erstellen.