Objektserialisierung in C++: Überblick über Werkzeuge und Bibliotheken
\n\nSerialisierung ist der Prozess der Umwandlung komplexer Datenstrukturen (Objekte, Arrays, Graphen) in ein lineares Format (Bytestrom, JSON-String, XML), das in einer Datei gespeichert, über ein Netzwerk übertragen oder in einer Datenbank abgelegt werden kann. Der umgekehrte Prozess – die Deserialisierung – stellt den ursprünglichen Zustand des Objekts wieder her. In C++ gibt es keine integrierte Unterstützung für Reflektion (wie in Java oder Python), daher muss man für die Serialisierung entweder manuell Code schreiben oder fertige Bibliotheken verwenden. In diesem Artikel betrachten wir die beliebtesten und effektivsten Werkzeuge für die Serialisierung in C++.
\n\n1. Boost.Serialization
\n\nDie älteste und leistungsfähigste Bibliothek. Sie ist Teil von Boost und muss separat installiert werden. Unterstützt binäre, textuelle (XML) und eigene portable Archivierung.
\n\n- \n
- Vorteile: umfassende Unterstützung für STL, Smart Pointer, Polymorphismus, zyklische Referenzen; Versionierung; Kompatibilität zwischen verschiedenen Plattformen. \n
- Nachteile: umständliche Syntax, langsame Kompilierung, große Größe der ausführbaren Datei. \n
#include <boost/archive/text_oarchive.hpp>\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/serialization/vector.hpp>\n#include <fstream>\n#include <vector>\n\nstruct Person {\n std::string name;\n int age;\n std::vector<std::string> tags;\n\n template<class Archive>\n void serialize(Archive & ar, const unsigned int version) {\n ar & name;\n ar & age;\n ar & tags;\n }\n};\n\nint main() {\n Person p{"Alice", 30, {"developer", "cpp"}};\n std::ofstream ofs("person.txt");\n boost::archive::text_oarchive oa(ofs);\n oa << p;\n\n // Deserialisierung\n Person restored;\n std::ifstream ifs("person.txt");\n boost::archive::text_iarchive ia(ifs);\n ia >> restored;\n return 0;\n}\n\n2. Cereal
\n\nEine moderne, leichte, header-only Bibliothek (erfordert keine Kompilierung). Funktioniert mit C++11 und höher. Unterstützt JSON, XML und binäre Formate. Sehr beliebt in der Spieleindustrie und der Embedded-Entwicklung.
\n\n- \n
- Vorteile: minimaler Overhead, intuitive API, Unterstützung für Smart Pointer, Polymorphismus, STL-Container. \n
- Nachteile: weniger Anpassungsmöglichkeiten als bei Boost. \n
#include <cereal/archives/json.hpp>\n#include <cereal/types/vector.hpp>\n#include <cereal/types/string.hpp>\n#include <sstream>\n\nstruct Person {\n std::string name;\n int age;\n\n template<class Archive>\n void serialize(Archive & ar) {\n ar(CEREAL_NVP(name), CEREAL_NVP(age));\n }\n};\n\nint main() {\n Person p{"Bob", 25};\n std::ostringstream oss;\n {\n cereal::JSONOutputArchive archive(oss);\n archive(CEREAL_NVP(p));\n }\n std::cout << oss.str() << std::endl;\n\n // Deserialisierung\n Person restored;\n std::istringstream iss(oss.str());\n {\n cereal::JSONInputArchive archive(iss);\n archive(restored);\n }\n return 0;\n}\n\n3. nlohmann/json (JSON for Modern C++)
\n\nDie beliebteste Bibliothek für die Arbeit mit JSON in C++. Obwohl sie ursprünglich nicht für die Objektserialisierung gedacht ist, kann sie leicht mit Hilfe von benutzerdefinierten Konvertern (Adapter Pattern) angepasst werden.
\n\n- \n
- Vorteile: einfache und elegante Syntax, hervorragende Dokumentation, header-only, Integration mit beliebigen Typen. \n
- Nachteile: funktioniert nur mit JSON, unterstützt keine binären Formate, erfordert bei komplexen Objektgraphen manuelle Beschreibung. \n
#include <nlohmann/json.hpp>\n#include <fstream>\n\nusing json = nlohmann::json;\n\nstruct Point {\n double x, y;\n Auch in der Bibliothek
E-Mail-Versand mit PHP: Vollständiger Leitfaden zur PHPMailer-Bibliothek
Aufgabenwarteschlangen in Java: Von ThreadPoolExecutor bis Disruptor
SMS-Versand mit PHP: API-Bibliotheken für die Integration
Elasticsearch-Client für Go (Golang): Vollständige Anleitung zur Arbeit mit ES