2011-01-11 3 views
0

Ich habe eine Reihe von Strukturen in C++. Ich möchte es in Datei speichern und sie wieder laden. Problem ist ein paar meiner Strukturen sind Zeiger auf Basisklassen (/ Strukturen). Also würde ich einen Weg brauchen, um den Typ herauszufinden und zu erstellen. Sie sind wirklich nur POD, sie haben alle öffentliche Mitglieder und keine Konstrukteure.C++ (Semi) Reflektion für Datei speichern/laden? (Hack?)

Was ist der einfachste Weg, um sie aus der Datei zu speichern und zu laden? Ich habe eine Menge von Strukturen und die einzigen Typen, die ich verwende, sind Ints, Zeiger oder c-Strings. Ich denke, ich könnte ein paar Makro-Hacks machen. Aber ich habe wirklich keine Ahnung, was ich tun soll.

Antwort

2

Rollen Sie nicht Ihre eigenen hier - verwenden Sie etwas gut entwickelt und getestet. Eine Idee ist, Protocol Buffers

+0

Das ist eine Menge generierten Code aus den kleinen Codezeilen, die ich geschrieben habe. –

+1

@ acidzombie24: das ist die ganze Idee :-) Jemand hat den Job schon erledigt –

0

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.

+0

Diese Boost-Makros machen den Code zu hässlich und fremd. IMO, der beste Ansatz für die Reflexion ist die Code-Generierung. –

+0

@Maxim: Dann müssen wir zustimmen, nicht einverstanden zu sein. Der Hauptvorteil dieser Makros besteht darin, dass sie NACH der Tatsache hinzugefügt und auf Strukturen verwendet werden können, die Sie nicht steuern.Nicht, dass ich auch die Code-Generierung meide, besonders in diesem (einfachen) Fall; Allerdings würde ich die Code-Generierung sicherlich nicht empfehlen, wenn es um "echte" Klassen geht, da dies wirklich peinlich wird -> Ich finde es sinnlos, noch eine andere Sprache zu lernen und meine Ausdruckskraft durch den Generator zu reduzieren. Je mehr Ebenen der Umleitungen, desto schwieriger ist es zu kontrollieren, was Sie tun. –