So serialisieren Sie einen Rohzeiger mit benutzerdefiniertem Verhalten entweder mit dem Boost :: Serialisierung oder derC++

Programme in C++. Entwicklerforum
Anonymous
 So serialisieren Sie einen Rohzeiger mit benutzerdefiniertem Verhalten entweder mit dem Boost :: Serialisierung oder der

Post by Anonymous »

Ich möchte eine dieser Serialisierungsbibliotheken verwenden, um einen STL -Behälter zu archivieren, der Rohzeiger auf ein Objekt hält. Ich möchte jedoch weder die Zeiger noch die Objekte, auf die sie hinweisen, speichern (oder muss). Diese Objekte haben eine eigene Speicher-/Last -Implementierung, die garantiert, dass sie zusammen mit einem Vektor in derselben Reihenfolge neu geladen werden, um die neue Adresse nach dem Nachladen zu erhalten. Benötigen Sie eine Methode, um die folgende Übersetzung durchzuführen, wenn Behälter Archivierung dieser Zeiger ausführen: < /p>

Archivieren Sie nur den Index (ist bereits eine Klassenvariable) < /li >
Verwenden Sie beim Last den Index, um die neue Adresse nachzuschlagen und diese wieder in den Container < /li>
< /ul>
Dieses Beispiel sollte helfen : < /p>
typedef struct MyStruct* MyPtr;

struct MyStruct {
// many instances of this struct will already exist when I restore MyMap below
// this index is guaranteed to uniquely identify an identical instance run-to-run
// even though the address will be different
// I want to save this index in place of MyPtr in the archived MyMap on archive save
int index {0};
// more data ...
}

// this index can then be used to lookup the address of it's MyStruct instance
// on archive load
std::vector pool;

// this STL container is what actually needs to be archived, but (as stated above)
// instead of saving MyPtr, I want to save the integer index
// then on load, use that to lookup the new address and restore that to the container
typedef std::unordered_map MyMap;
MyMap myMap;

void doWork() {
// read MyMap from archive: ar >> myMap;
// work with MyMap
// save MyMap to archive: myMap >> ar;
}
< /code>
scheint dies aus dem, was ich aus der Dokumentation schließen kann, möglich sein sollte, aber ich habe es nicht erfolgreich gemacht, diese Arbeit zu machen. Dies unter Verwendung von Boost :: Serialisierung. Es ist einfach, den Index einfach zu speichern, aber bei der Last besteht das Standardverhalten der Bibliothek darin, eine neue Instanz des Objekts zu erstellen, auf die der Index darauf hingewiesen wurde. Ich habe versucht, dies mithilfe der Klassenserialisierungsmerkmale zu überschreiben, nämlich die Implementierung und/oder die Tracking -Ebene ohne Erfolg. kam zu der (vielleicht falschen) Schlussfolgerung, dass der Versuch, das zu tun, was ich möchte, nicht aus der Methode von MyStruct :: Serialize () möglich sein wird. Ich hatte gedacht, ich könnte einen Helfer verwenden, um die Index -Lookup durchzuführen, aber als die Serialize () -Methode aufgerufen wird, scheint es zu spät, etwas gegen die Verfolgung zu unternehmen, die das Objekt bei der Last erzeugt wird.
Als ich die Müsli -Bibliothek anfänglich als mögliche Alternative fand, war ich hoffnungsvoll, da sie sich einfach nicht darum gekümmert hatte. Jetzt bin ich jedoch mit einem static_assert fest und sagt, dass Rohzeiger nicht unterstützt werden und stattdessen einen intelligenten Zeiger verwenden (was für mich keine Option ist) < /p>
Ich hatte gehofft, dass die Bereitstellung angeboten wird Das benutzerdefinierte Typ -Handling für MyPTR kann das von mir benötigte Verhalten liefern, aber jetzt scheint es, dass ich möglicherweise die bereitgestellte STL -Container -Serialisierung und/oder die Archivvorlagen spezialisiert habe. Beide sehen kompliziert aus. etwas Offensichtliches verpasst? Ist es möglich, eine einfache Methode für MyStruct -Zeiger bereitzustellen, oder versuche ich, alle STL -Behälter zu spezialisieren, die ich brauche? Oder vielleicht ist es etwas, das ich nicht sehe, das dies in einer Archivspezialisierung kann?
Danke!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post