2010-11-18 11 views
0

Ich habe eine Basisklasse und 4 abgeleitete Klassen. Ich speichere alle meine abgeleiteten Klassen in einem Vektor des Basisklasse-Zeigertyps. Während der ersten Initialisierung erzeuge ich jeden abgeleiteten Typ mit seinen Konstruktoren anders. Grundsätzlich haben sie jeweils unterschiedliche Param-Typen in ihren ctors. (Ich musste einen geschützten Standard-Ctor bereitstellen, um BOOST_CLASS_EXPORT kompilieren zu lassen, aber das ist eine andere Geschichte). Ich kann/kann nicht alle Mitglieder (in ctor) dieser abgeleiteten Klassen speichern.Boost :: Serialisierung polymorphe Typ Initialisierung

Jetzt, wenn ich Objekte von der Festplatte mit boost :: serialize laden, werden diese Member (die nicht serialisiert und spezifisch für jeden abgeleiteten Typ sind) zerstört. Und ich kann mir keine Möglichkeit vorstellen, diese abgeleiteten Typen neu zu initialisieren, da ich nur die Basisklassenzeiger speichere.

Was genau ich brauche, ist in der Lage, meine abgeleitete Typen (Zeiger) teilweise zu laden, ohne alle ihre Inhalte zu löschen ..

Gibt es eine Möglichkeit, dies zu überwinden, eine magische Schub definieren oder Funktionsaufruf vielleicht? Ansonsten ist Polymorphie mit boost :: serialize überhaupt nicht möglich. Ich sollte etwas vermissen und hoffe, ich könnte mein Problem gut genug definieren.

Antwort

0

Sie sollten keinen Standardkonstruktor nur für die Serialisierung erstellen müssen. Stattdessen können Sie die Daten, die von einem nicht standardmäßigen Konstruktor benötigt werden, speichern/laden und damit beim Laden neue Objekte erstellen.

Auf diese Weise können die Konstruktoren die Gültigkeit von Datenelementen auch während der Serialisierung sicherstellen, und die Serialisierungsbibliothek muss die Datenelemente Ihrer Objekte nicht direkt bearbeiten. Dies sollte Datenlöschung verhindern.

Zum Beispiel können, wenn Ihre Klasse ein name und ein size mit konstruiert werden, können Sie die Funktionen überladen wie folgt:

template <class Archive> 
inline void save_construct_data(Archive & ar, const my_class * t, const unsigned int) { 
    ar << my_class->name(); 
    ar << my_class->size(); 
} 

template<class Archive> 
inline void load_construct_data(Archive & ar, my_class * t, const unsigned int) { 
    std::string name; 
    int size; 
    ar >> name; 
    ar >> size; 
    ::new(t)my_class(name, size); // placement 'new' using your regular constructor 
} 

here die Dokumentation Check-out.

Verwandte Themen