Boost enthält eine Serialisierungsbibliothek . Ich habe es selbst nicht benutzt, aber normalerweise funktionieren die Boost-Bibliotheken ziemlich gut.
Leider gibt es keinen automatischen Weg Objekte in C ++ zu serialisieren. Dies liegt daran, dass jede Serialisierungs-Engine in der Lage sein muss, Ihr benutzerdefiniertes Objekt in der Laufzeit zu "verstehen", und C ++ enthält nicht die erforderlichen Informationen dafür. Java und .Net auf der anderen Seite haben, was heißt, Reflection. Dieser Mechanismus ermöglicht es jedem, die Datenstruktur eines beliebigen Objekts in der Laufzeit zu durchsuchen.
All dies bedeutet nicht, dass es keine Möglichkeit gibt, ein C ++ Objekt mit relativ geringem Aufwand zu serialisieren. Nehmen Sie zum Beispiel die Standard-C ++ - Stream-Bibliothek. Durch das Schreiben
%Vor%Sie serialisieren tatsächlich ein Objekt vom Typ int. Es ist möglich, diesen Mechanismus zu erweitern, um auch Ihre benutzerdefinierte Klasse zu unterstützen. Dies geschieht durch Überladen des Operators & lt; & lt; Es ist nicht so schön wie Java-Serialisierung, aber es ist auch sehr praktisch.
Es gibt auch einige Bibliotheken, die es noch einfacher machen. Wie bereits erwähnt, macht Boost-Serialisierungsbibliothek gute Arbeit. Die Arbeit mit der Boost-Serialisierung sieht dem Arbeiten mit iostream sehr ähnlich, löst aber einige Probleme, die den Standardströmen innewohnen.
Die Protokollpuffer von Google stellen eine C ++ - Implementierung im Kernpaket bereit. Als netter Vorteil können Sie diese Daten dann mit vielen anderen Sprachen teilen - Sie werden jedoch eingeschränkt sein die generierten -Typen verwenden, anstatt Ihre eigenen (was einige Serialisierungs-Engines in anderen Sprachen unterstützen).
In der Realität ist das kein Problem, da Sie (wenn nötig) die generierten Typen als DTO behandeln können, die zu Ihren tatsächlichen Domänenobjekten gehören.
Boost.Serialization ist eine sehr gute Bibliothek und unterstützt auch die grundlegende Versionierung - etwas, das mit der automatischen Serialisierung nie ganz möglich ist. Da ich gerade noch eine bessere Versionierung benötigte, habe ich meine eigene Serialisierungsbibliothek geschrieben, die dem Boost.Serialization-Stil folgt (weil der Autor von Boost.Serialization nicht an der Verbesserung interessiert war).
Beachten Sie, dass Sie die Serialisierungsfunktionen auch für andere Zwecke wie GUI- oder Webformulargenerierung missbrauchen können, wenn ein wenig Hilfsdaten hinzugefügt werden (siehe, wie Boost.Serialization XML ausführt).
Es muss angemerkt werden, dass die beliebte Methode, ganze Strukturen zu speichern (indem man sie in char * umwandelt und sizeof (struct) Bytes schreibt) vollständig nicht portierbar ist, keine Versionsverwaltung unterstützt und bricht, wenn die Struktur irgendwelche Zeiger enthält oder C ++ (Nicht-POD) Objekte.
Mit einer Menge manueller Grunt-Arbeit (eigentlich mit der Implementierung Ihrer eigenen intrusiven oder nicht intrusiven RTTI) kann man einen Automatisierungsgrad erzielen, der mit C # / Java vergleichbar ist.
Siehe detaillierte Informationen hier:
>Ich habe diesen erfolgreich benutzt:
und es funktionierte gut für mich auf iOS und Android. Es ist eine Header-Only-Bibliothek und hat keine externen Abhängigkeiten, so dass es sehr bequem zu verwenden ist. Ich bevorzuge es über Boost, weil ich nicht alle Boost-Abhängigkeiten importieren wollte. Die Bibliothek ist klein und unterstützt sowohl XML- als auch JSON-, binäre und benutzerdefinierte Serialisierungsformate.
Die Bibliothek (wie Boost) erfordert, dass Sie explizit Serialiazion- und Deserialisierungscode für Basisklassen schreiben, während Collections automatisch behandelt werden.
Tags und Links c++ persistence serialization oop