Serialisierungsbibliotheken in C++

Abdul Mateen 11 Dezember 2023
  1. Überblick über die Serialisierung
  2. Serialisierungsbibliotheken in C++
  3. Vergleich zwischen allen Serialisierungsbibliotheken
Serialisierungsbibliotheken in C++

In diesem Lernprogramm lernen Sie die verschiedenen C++-Serialisierungsbibliotheken kennen.

Zuerst lernen wir die Serialisierung und ihren Zweck in C++ kennen. Als Nächstes werden wir Serialisierungsbibliotheken in C++ und deren Verwendung in unserem Programm besprechen.

Überblick über die Serialisierung

Programmierer arbeiten routinemäßig mit Datenobjekten im Speicher. Und manchmal müssen die Objekte über ein Netzwerk gesendet oder in einen dauerhaften Speicher (normalerweise eine Datei) geschrieben werden, um einige Teile des Programmzustands zu speichern.

Serialisierung ist der Prozess/die Technik zum Umwandeln des Daten- oder Objektstatus in ein binäres Format. Die binäre Form ist der Bytestrom zum Speichern/Bewahren des Objektzustands oder zum Übertragen desselben an Speicher, Datenbank, Datei oder Platte über ein Computernetzwerk.

Die Umkehrung des Serialisierungsprozesses wird als Deserialisierung bezeichnet. Die Serialisierung ist ideal geeignet, wenn Sie den Zustand der strukturierten Daten (d. h. C++-Klassen oder -Strukturen) während oder nach der Ausführung des Programms beibehalten möchten.

Über serialize() und deserialize() können Sie anhand eines Beispiels auf dieser Website nachlesen.

Die Serialisierung bietet eine stabile Byte-Darstellung des Werts von Softwareobjekten. Dann können diese Bytes über ein Netzwerk gesendet werden, das auch in zukünftigen Implementierungen mit unterschiedlicher Hardware und Software weiterhin korrekt funktioniert.

Serialisierung in verschiedenen Sprachen

Bevor Sie fortfahren, wird der Serialisierungsprozess in verschiedenen Sprachen unterschiedlich implementiert. Lassen Sie uns sie unten erkunden.

  1. In Java ist die Serialisierungsmethode writeObject, die in ObjectOutputStream implementiert ist.
  2. In Python ist die Serialisierungsmethode ein pickle.dumps().
  3. In Ruby ist die Serialisierungsmethode marshal.dump().
  4. In C++ ist die Methode boost::archive::text_oarchive a (Dateiname); a << Daten; Rufen Sie die Serialisierungsmethode auf
  5. In MFC (Microsoft Foundation Class Library) ist die Serialisierungsmethode: Steuern Ihrer Klasse von CObject.

Unser Hauptaugenmerk liegt auf der C++-Serialisierung, also sehen wir uns an, wie es funktioniert.

C++ Boost.Serialization verwendet Textarchivobjekte. Die Serialisierung schreibt in ein Ausgabearchivobjekt, das als Ausgabedatenstrom fungiert.

Beim Aufruf für Klassendatentypen ruft der Ausgabeoperator >> die Klasse auf, um die Funktion zu serialisieren. Jede Serialisierungsfunktion verwendet den Operator & oder über >> und serialisiert rekursiv verschachtelte Objekte, um ihre Datenmitglieder zu speichern oder zu laden.

Um die Serialisierung in C++ besser zu verstehen, können Sie sich diese Website ansehen.

Serialisierungsbibliotheken in C++

C++ bietet viele Bibliotheken für die Serialisierung mit Ausnahme der Boost-Serialisierung. Alle Bibliotheken tragen dazu bei, eine hohe Serialisierungsleistung zu erzielen, also lassen Sie uns einige untersuchen.

Protobuf

Protocol Buffers (Protobufs), eine plattformübergreifende Schnittstelle, die zum Serialisieren der Daten verwendet wird. Es ist hilfreich für die Kommunikation zwischen den Programmen über ein Netzwerk.

Der Protobuf-Serialisierungsmechanismus wird durch die Protokollanwendung bereitgestellt. Dieser Compiler analysiert die .proto-Datei und generiert als Ausgabe Quelldateien entsprechend der konfigurierten Sprache durch seine Argumente, in diesem Fall C++.

Sie können das Tutorial unter diesem Link lesen, um Protobufs besser zu verstehen.

FlatBuffers

FlatBuffers ist eine plattformübergreifende Open-Source-Lösung, die verwendet wird, um maximale Speichereffizienz zu erreichen. Sie können direkt auf serialisierte Daten zugreifen, ohne sie mit Vorwärts-/Rückwärtskompatibilität zu analysieren.

Mit FlatBuffers generieren Sie zuerst Ihr C++-Schema mit der Option --CPP. Dann können Sie Flatbuffer in die Datei einfügen, um diesen generierten Code zu lesen oder zu schreiben.

Sie finden die Serialisierungsimplementierung mit FlatBuffers unter diesem Link.

Getreide

Cereal ist die reine Header-C++ 11-Serialisierungsbibliothek. Cereal nimmt beliebige Datentypen und wandelt sie umkehrbar in verschiedene Repräsentationen um, wie z. B. kompakte Binärcodierungen, XML oder JSON.

Cereal ist erweiterbar, schnell, einheitengetestet und bietet eine vertraute Syntax wie Boost. Um die vollständige Müslibibliothek herunterzuladen, klicken Sie hier.

Als nächstes haben wir ein Beispiel, das die Verwendung der Müslibibliothek zeigt:

#include <cereal/archives/binary.hpp>
#include <cereal/types/memory.hpp>
#include <cereal/types/unordered_map.hpp>
#include <fstream>

struct MyRecord {
  uint8_t x, y;
  float z;
  template <class Archive>
  void serialize(Archive& ar) {
    ar(x, y, z);
  }
};
struct SomeData {
  int32_t id;
  std::shared_ptr<std::unordered_map<uint32_t, MyRecord>> data;
  template <class Archive>
  void save(Archive& ar) const {
    ar(data);
  }
  template <class Archive>
  void load(Archive& ar) {
    static int32_t idGen = 0;
    id = idGen++;
    ar(data);
  }
};
int main() {
  std::ofstream out("out.cereal", std::ios::binary);
  cereal::BinaryOutputArchive archive(out);
  SomeData myData;
  archive(myData);
  return 0;
}

In der primären Funktion erstellen wir im Binärmodus eine Binärdatei mit dem Namen os.cereal.

In der folgenden Zeile erstellen wir ein Objekt der Klasse BinaryOutputArchive aus binary.hpp, definiert im Archives-Ordner der Cereal Library. Wir übergeben unser Dateiobjekt an den Konstruktor von BinaryOutputArchive.

Als nächstes erstellen wir unser zu serialisierendes Datenobjekt, das Objekt der Klasse some data. Schließlich übergeben wir in der vierten Zeile der primären Funktion unser Datenobjekt an das Archiv und rufen indirekt die Funktion save auf, um Daten in der Ausgabedatei zu speichern, um ein serialisiertes Objekt in der Ausgabedatei out.cereal zu speichern.

Die Binärdatei out.cereal enthält unsere serialisierten Daten. Die Ausgabe dieses Codes sind Daten in der Datei out.cereal.

Diese Daten liegen in binärer Form vor und wir können sie mit verschiedenen Dienstprogrammen/Befehlen überprüfen, die in verschiedenen Betriebssystemen verfügbar sind.

HPS

HPS ist ein Hochleistungs-Simulationstool und die reine Header-Bibliothek für die Datenserialisierung in C++11. HPS kodiert Ihre Daten in ein komprimiertes Format, um sie einfach über das Netzwerk zu übertragen.

HPS ist 150 % schneller als die normale Boost-Serialisierung in C++, da es nur eine Codezeile für Standard-Vorlagenbibliotheken und primitive Datentypen benötigt.

Sie können auch die Funktionen write to_stream und from_stream verwenden, um Daten in den Dateien zu lesen und zu schreiben. Für ein besseres Verständnis von HPS können Sie auch diese Website besuchen.

GitHub Msgpack

MessagePack ist ein Open-Source-spezifisches Serialisierungsformat. Sie können problemlos Daten in verschiedenen Formaten wie JSON und XML austauschen.

Der ganzzahlige Wert erfordert nur ein Byte, um Daten zu codieren, während der Zeichenfolgenwert ein zusätzliches Byte erfordert.

Zur weiteren Implementierung von msgpack können Sie den link besuchen.

Boost.Serialisierung

Die Bibliothek Boost Serialization in C++ ermöglicht es, Objekte zum Speichern und Laden in Bytes umzuwandeln, um sie wiederherzustellen. Verschiedene Formate erzeugen die Folgen von Bytes.

Alle diese Formate werden von Boost unterstützt. Die Serialisierung ist nur für die Verwendung mit dieser Bibliothek vorgesehen.

In C++ müssen Sie für jedes Objekt, das Sie serialisieren möchten, die Methode serialize implementieren. Es sollte ein Archiv als Argument nehmen; Ein Archiv ähnelt einem Input/Output-Datenstrom.

Anstatt die Operatoren << oder >> zu verwenden, können Sie den allgemeinen Operator verwenden und Bot-Speicher- und Ladevorgänge durchführen. Auf dieser Website können Sie mehr über die Boost-Serialisierung lesen.

Apache Avro

Apache Avro ist ein Datenserialisierungssystem. Avro C++ ist eine C++-Bibliothek, die die Avro-Spezifikationen implementiert, und die Bibliothek soll in der Streaming-Pipeline verwendet werden.

Beispielsweise führt Apache Kafka die Datenserialisierung und -deserialisierung mit zentral verwalteten Schemas durch.

Avro erfordert keine Codegenerierung; Sie können das Codegenerierungstool verwenden. Der Codegenerator liest ein Schema und gibt ein C++-Objekt aus, um die Daten für das Schema in .schema darzustellen.

Es erstellt auch den Code, um dieses Objekt zu serialisieren und zu deserialisieren. Hier wird die ganze schwere Codierung für Sie erledigt.

Auch wenn Sie benutzerdefinierte Serialisierer oder Parser mit den zentralen C++-Bibliotheken schreiben möchten, kann der generierte Code ein Beispiel für die Verwendung dieser Bibliotheken sein.

Dieser Stil kann funktionieren, aber Sie können Struct oder Klasse für die perfekte Lösung serialisierbar machen.

Kapitän Proto

Cap’n Proto kann das Datenformat leicht austauschen, da seine Fähigkeit vom RPC-System (Remote Procedure Call) abhängt. In Cap'n Proto gibt es kein Konzept der Kodierung/Dekodierung.

Das Datenaustauschformat fungiert als Kodierung und repräsentiert Speicher. Sie können ganz einfach Bytes direkt von der Festplatte schreiben, indem Sie Ihre Daten strukturieren.

Das beste Beispiel finden Sie auf der Seite Cap’n Proto.

Sparsamkeit

Apache Thrift ist ein Serialisierungs-Framework, das sich auf Sprachprobleme konzentriert. Sie können abstrakte Datentypen in IDL (Interface Definition Language) definieren, die weiter in Quellcode für jede unterstützte Sprache kompiliert werden.

Dann wird durch diese generierten Codes für benutzerdefinierte Typen eine vollständige Serialisierung bereitgestellt. Apache Thrift stellt sicher, dass jeder Datentyp damit gelesen oder geschrieben werden kann.

Das beste Beispiel für Apache Thrift finden Sie auf dieser Seite.

JA

YAS wird aufgrund seiner geringen Serialisierungsgeschwindigkeit als Ersatz für Boost.serialization erstellt; Es ist auch eine reine Header-Datei und benötigt keine Bibliotheken von Drittanbietern. Es unterstützt die Binär-, Test- und JSON-Formate und erfordert C++11.

Auf dieser Seite können Sie über YAS lesen.

Vergleich zwischen allen Serialisierungsbibliotheken

Alle diese Bibliotheken bieten Serialisierung und haben ihre zu unterschiedlichen Zeiten. Wir zeigen Ihnen nur die Ergebnisse dieser Bibliotheken, während Sie den Code und weitere Details auf dieser Seite finden (die gleiche Zeile wird bereits in der vorherigen Zeile geteilt).

Hier in diesem Artikel zeigen wir Ergebnisse aus einem Artikel.

Dieser Code wurde auf einem typischen Desktop-Computer mit einem Intel Core i7-Prozessor ausgeführt, auf dem Ubuntu 16.04 ausgeführt wird, und die durchschnittliche Zeit wurde berechnet.

Serialisierer Größe des Objekts Durchschnittliche Gesamtzeit
Sparsamkeit-binär 17017 1190.22
sparsam-kompakt 13378 3474.32
protobuf 16116 2312.78
Schub 17470 1195.04
Nachrichtenpaket 13402 2560.6
Getreide 17416 1052.46
Avro 16384 4488.18
ja 17416 302.7
ja-kompakt 13321 2063.34

Cap’n Proto und Flatbuffers speichern Daten in einer serialisierten Form, wobei Serialisierung bedeutet, den Zeiger auf den internen Speicher zu bekommen. Daher messen wir in Cap’n Proto den gesamten Build/Serialize/Deserialize-Zyklus.

Bei anderen Bibliotheken können wir auch den Zyklus der bereits aufgebauten Datenstruktur serialisieren/deserialisieren.

Serialisierer Objektgröße durchschn. Gesamtzeit
capnproto 17768 400,98
Flatbuffer 17632 491.5

Wenn Sie die obige Datendarstellung nach Größe sehen, nimmt YAS mehr Objektgröße als andere Bibliotheken. Dennoch nimmt YAS wenig Zeit in Anspruch, wenn Sie die Serialisierungszeit berücksichtigen.

Somit zeigt YAS die schnellste Serialisierung unter allen Bibliotheken.

Hinweis: Die Größe wird in Bytes und die Zeit in Millisekunden gemessen.

Wir hoffen, dass Sie jetzt die Serialisierung und ihre Verwendung verstehen. Jetzt wissen Sie, welche Bibliotheken die Serialisierung in C++ durchführen können oder welche Bibliothek Sie am schnellsten erreichen können.