повысить сериализацию, сохранить в нескольких типах архивов и предотвратить создание нового объекта при загрузке с помощью указателя

Я использую ускоренную сериализацию для сохранения объектов из нескольких выходных файлов архива (xml, двоичный и текстовый). Когда библиотека загружается через указатель, она создает новый объект, и я хочу предотвратить это для некоторых моих объектов, скажем, для моих диалоговых классов. Поэтому я загружаю диалоги со ссылкой. Но код уродлив:

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);
    }              
}

Поэтому я придумал следующее решение:

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
};

В моих производных классах я реализую эти функции. И сохранение и загрузка тогда примерно такие:

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

Итак, для каждого вывода архива у меня есть пара виртуальных функций в классе BaseDialog, что тоже нехорошо.

Так что у кого-нибудь есть идеи, как решить эту проблему


person user152508    schedule 10.04.2012    source источник


Ответы (1)


boost::serialization может без проблем сериализовать производный тип через его базу. Взгляните на эту ссылку.

person Ylisar    schedule 10.04.2012
comment
если я сериализую через базовый указатель, он создаст новый объект, а это не то, что я хочу - person user152508; 10.04.2012