C ++ Boost serialization Сериализация шаблонных производных классов - PullRequest
5 голосов
/ 02 августа 2010

Я хотел бы сериализовать класс с атрибутом в виде списка указателей на универсальный класс

Это родительский класс, из которого происходит универсальный класс:

class Base{

    public :

        friend class boost::serialization::access;

        virtual ~Base(){}

        template<class Archive>
        void serialize(Archive & ar, const unsigned int version)
        {
        }

        virtual string Getid() = 0 ;

};

Общий класс:

template<typename T>
class GenericBase : public Base
{
    public:

        friend class boost::serialization::access;

        GenericBase<T>(string id){}
        ~GenericBase(){}

        string id;

        vector<T> data

        template<class Archive>
        void serialize(Archive & ar, const unsigned int version)
        {
            ar & boost::serialization::base_object<Base>(*this);
            ar & BOOST_SERIALIZATION_NVP( id);
            ar & BOOST_SERIALIZATION_NVP( data);

        }

        string Getid() { return id; }

};

Класс, который я хочу сериализовать

class Use
{
    public:

        friend class boost::serialization::access;

        int Id;

        map<string, Base*> BaseDatas;

        Use();
        ~Use();

};

Итак, после прочтенияповысить сериализацию документа (http://www.boost.org/doc/libs/1_43_0/libs/serialization/doc/serialization.html#derivedpointers), я попробовал это в коде сериализации:

main(){

   Use u = Use();

   std::ofstream ofs(filename, ios::binary);

   // save data to archive

   boost::archive::binary_oarchive oa(ofs);

   oa.template register_type<GenericBase<Type1> >();
   oa.template register_type<GenericBase<Type2> >();
   oa.template register_type<GenericBase<Type3> >();

   oa<<u;

}

Я получил сообщение,

ошибка: «шаблон» (в качестве устранения неоднозначности)) допускается только в шаблонах

, поэтому я заменил

oa.template register_type> ();

на

oa.register_type ();

это сработало, и я смог сохранить в текстовом и двоичном (я проверил данные)

для загрузки сейчас,я просто использовал эти строки:

main(){

    Use u;

    std::ifstream ifs(filename, ios::binary);

    // load data

    ia.register_type<GenericBase<Type1> >();

    boost::archive::binary_iarchive ia(ifs);

    ia>>u;

}

это выдало мне ошибку:

ошибка: нет подходящей функции для вызова GenericBase :: GenericBase () '

кто-то сказал мне, что я должен переопределить 2 метода сохранения и загрузки, как в этом примере http://www.boost.org/doc/libs/1_43_0/libs/serialization/doc/serialization.html#constructors

namespace boost { namespace serialization {
template<class Archive>
inline void save_construct_data(
    Archive & ar, const my_class * t, const unsigned int file_version)
    {
        // save data required to construct instance
        ar << t->m_attribute;
    }

template<class Archive>
inline void load_construct_data(
    Archive & ar, my_class * t, const unsigned int file_version)
    {
        // retrieve data from archive required to construct new instance
        int attribute;
        ar >> attribute;
        // invoke inplace constructor to initialize instance of my_class
       ::new(t)my_class(attribute);
    }
}} // namespace ...

но где я должен их определить?В объявлении класса Use?А как мне поступить с участником

map<string, Base*> BaseDatas;

?

спасибо за помощь;)

Ответы [ 2 ]

4 голосов
/ 08 октября 2010

Проще комментировать, если вы предоставите рабочий (вырезанный и вставленный) пример вашего ошибочного кода с некоторыми фиктивными данными ...

Но я все равно пытаюсь ответить ...

Boost.serialisation пытается вызвать конструктор GenericBases по умолчанию, но не удается, поскольку вы его не предоставляете.Boost.serialisation сначала создает ваш объект (или пытается сейчас), затем читает файл и устанавливает переменные.

Вы можете попробовать объявить защищенный конструктор по умолчанию, доступ к которому должен иметь сквозной доступ.

0 голосов
/ 02 августа 2010

но где мне их определять?

Вы можете определить их в любом из ваших заголовков

И как мне поступить с участником...

Я думаю, что вы можете получить импульс для отслеживания указателей, используя BOOST_CLASS_TRACKING ...

http://www.boost.org/doc/libs/1_42_0/libs/serialization/doc/special.html#objecttracking

...