C ++ Boost序列化序列化模板化派生类

时间:2010-08-02 10:47:52

标签: c++ templates serialization boost derived-class

我想将一个带有属性的类序列化为泛型类

上的指针列表

这是泛型类派生的父类:

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

};

因此,在阅读了boost序列化文档(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&gt;();

通过

  

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 ...

但我在哪里定义它们?在使用类的声明?我该如何处理会员

map<string, Base*> BaseDatas;

感谢您的帮助;)

2 个答案:

答案 0 :(得分:4)

如果您提供失败代码的工作(剪切和粘贴)示例以及一些虚拟数据,则更容易发表评论......

但无论如何我试着回答......

Boost.serialisation正在尝试调用GenericBases默认构造函数,但由于您未提供它而失败。 Boost.serialisation首先创建你的对象(或现在尝试),然后读取文件并设置变量。

你可以尝试声明一个受保护的默认构造函数,哪个boost应该具有访问权限。

答案 1 :(得分:0)

  

但我在哪里定义它们?

您可以在任何标题中定义它们

  

我该如何处理会员...

我认为你可以使用BOOST_CLASS_TRACKING来提升跟踪指针...

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