die Zeiger mit einem besonderen Problem darstellen: Ich nehme an, dass mehrere Struktur tatsächlich auf den gleichen Zeiger verweisen kann, und dass Sie würde einen einzelnen Zeiger wie neu erstellt werden, wenn Deserialisieren ...
der ersten Idee, Kesselblech Code zu vermeiden, ist ein Kompilierung-Reflexion-Tool zu erstellen:
Diese zwei Makros erzeugen einige böse Informationen auf Ihrer Struktur, so dass Sie sie dann mit Fusion-Algorithmen verwenden können, die die Lücke zwischen Kompilierungszeit und Laufzeit überschreiten.
Jetzt benötigen Sie etwas, mit dem Sie Ihre Daten serialisieren und deserialisieren können. Die Deserialisierung ist normalerweise ein bisschen schwieriger, obwohl Sie hier den Vorteil haben, dass kein Polymorphismus (was die Dinge immer schwierig macht).
Normalerweise identifizieren Sie in einem ersten Durchgang das Diagramm der zu serialisierenden Objekte, weisen allen eine ID zu und verwenden diese ID anstelle des Zeigers beim Serialisieren. Für Deserialisieren verwenden Sie eine 3-Säulen Karte:
- ist die Karte ID -> (Zeiger auf Objekt zugewiesen, Liste von Zeigern, die nicht eingestellt werden konnten)
- zuteilen alle Objekte, die ID-Karte Füllen mit ein Zeiger auf das Objekt zugewiesen jedes Mal
- , wenn Sie eine ID deserialisieren benötigen, ist es in der Karte nachschauen, wenn abwesend einen Zeiger auf den Zeiger in der entsprechenden Liste setzen
- wenn Sie den Mauszeiger auf das Objekt zugewiesen setzen Nehmen Sie sich in der Karte Zeit, um alle nicht gesetzten Zeiger zu füllen (und gleichzeitig die Liste zu entfernen)
Natürlich ist es besser, Frameworks für Sie zu haben. Sie können versuchen s11n, wenn ich mich richtig erinnere, behandelt Zyklen von Referenzen.
Das ist eine Menge generierten Code aus den kleinen Codezeilen, die ich geschrieben habe. –
@ acidzombie24: das ist die ganze Idee :-) Jemand hat den Job schon erledigt –