Ich habe eine baumartige Struktur, die serialisiert werden muss. Typische Struktur, wobei jeder Knoten parent
Mitglieder und children
Vektoren hat. parent
ist ein roher Zeiger auf Klasse und children
sind vector
s von shared_ptr
s. Nun scheint es, dass die Serialisierung funktioniert, aber die de -Serialisierung lässt die parent
-Member nicht initialisiert (Zeiger auf 0xcccccccc
oder 0x00000000
).
Die parent
-Member werden geladen, wenn das eigentliche übergeordnete Objekt die Deserialisierung noch nicht beendet hat, d. h. das parent
-Member des Kindes wird über die Deserialisierungsanforderung des children
des Elterns geladen. Da dies zyklisch ist, habe ich mich gefragt, ob ich spezielle Maßnahmen ergreifen muss, damit es funktioniert.
Danke für die Hilfe.
Update: So sieht meine Serialisierungsfunktion aus:
%Vor% Wenn ich archive & t.children
auskommentiere, wird parent
korrekt ausgefüllt.
Update 2: Ok, ich habe es geschafft, dies zu einem minimalen Beispiel zu machen, das das Problem aufweist. Folgendes sollte kompilieren:
%Vor% Schritt durch den Code. Die parent
des Kindes bleibt immer null.
Okay, anscheinend bin ich einem anderen unglücklichen Käfer zum Opfer gefallen. Boost 1.55 hat noch keine funktionierende Serialisierungsbibliothek für VS2013, laut der neuesten Boost-Release-Seite . Sprich über verschwendete Zeit ...
Bekannte Fehler mit Visual Studio 2013 / Visual C ++ 12
Visual Studio 2013 wurde ziemlich spät im Release-Prozess veröffentlicht, so dass es mehrere gibt ungeklärte Probleme. Dazu gehören:
Die Serialisierung kann aufgrund eines fehlenden Includes nicht kompiliert werden.
Ich hatte das gleiche Problem in der Vergangenheit, und ich fand keine solide Lösung aus der Box. Aber der folgende kleine Hack funktioniert gut - Sie könnten Serialisierung und Deserialisierung Funktionen getrennt angeben (nicht mit Standard Vorlage und & amp; -Operator):
%Vor%Danach können Sie die Wiederherstellung eines Zeigers auf das übergeordnete Objekt in der Deserialisierungsmethode wie folgt angeben:
%Vor%Wenn Sie Boost Serialization verwenden, sollte alles sofort funktionieren. Ihre Klasse serialize kann aussehen wie
%Vor%Archive hash Zeiger, so dass es nicht jedes Element mehr als einmal erstellen wird.
Ein wichtiges Detail: Wenn Ihre Knoten von einem abgeleiteten Typ sein können, müssen Sie dem Archiv beibringen, welche Typen am // Platz erwartet werden, Details finden Sie in der Boost-Dokumentation zum Serialisieren von abgeleiteten Typen durch Zeiger auf den Basistyp.
Wenn Sie sicher sind, dass Ihre Baumstruktur korrekt und in sich abgeschlossen ist (root hat NULL als Parent, alle anderen Knoten sind "children" ihres jeweiligen "parent" usw.), dann können Sie den Code etwas effizienter organisieren :
%Vor%(Ich nehme an, dass Sie im Konstruktor "parent" auf NULL setzen).
Ich habe diesen Code nicht mit VS 2013 getestet.
Tags und Links c++ c++11 serialization boost