2012-04-10 1 views
1

Ich verwende Boost-Serialisierung, um Objekte aus mehreren Archivausgaben (XML, Binär und Text) zu speichern. Wenn die Bibliothek durch einen Zeiger geladen wird, erzeugt sie ein neues Objekt, und das möchte ich für einige meiner Objekte verhindern, sagen wir für meine Dialogklassen. Also lade ich die Dialoge mit Referenz. Aber der Code ist hässlich:Boost Serialisierung speichern auf mehrere Archivtypen und verhindern Konstruktion eines neuen Objekts beim Laden mit Zeiger

boost::archive::xml_iarchive ia; 
for(vector<BaseDialog*>::iterator it= dialogs.begin();it!=dialogs.end();it++) 
{ 
    if(typeid(it) == MyDialog1) 
    { 
     MyDialog1* dlg = dynamic_cast<MyDialog1*>(it); 
     ia & (*dlg); 
    } 

    if(typeid(it) == MyDialog2) 
    { 
     MyDialog2* dlg = dynamic_cast<MyDialog2*>(it); 
     ia & (*dlg); 
    }    
} 

So kam ich mit folgenden Lösung:

class BaseDialog 
{ 
public: 
    virtual void SaveState(boost::archive::xml_oarchive& oa)=0; 
    virtual void LoadState(boost::archive::xml_iarchive& ia)=0; 
    virtual void SaveState(boost::archive::binary_oarchive& oa)=0; 
    virtual void LoadState(boost::archive::binary_iarchive& ia)=0; 
    // other formats here 
}; 

In meinen abgeleiteten Klassen mir diese Funktionen bin die Umsetzung. Und das Speichern und Laden ist dann so etwas wie dieses:

boost::archive::xml_iarchive ia; 
for(vector<BaseDialog*>::iterator it= dialogs.begin();it!=dialogs.end();it++) 
    it->LoadState(ia); 

also für jedes Archiv Ausgang I virtuellen Funktionspaar in der BaseDialog Klasse haben, die auch nicht gut ist.

So hat jemand Ahnung, wie dieses Problem zu lösen

Antwort

0

boost::serialization einen abgeleiteten Typen durch seine Basis ohne Probleme serialisiert werden kann. Werfen Sie einen Blick auf this Link.

+0

Wenn ich durch den Basiszeiger serialisieren wird es neues Objekt erstellen, was ich nicht will – user152508