【问题标题】:boost::serialisation for inherited template classboost::serialisation 用于继承的模板类
【发布时间】:2014-02-09 18:09:14
【问题描述】:

我有一个虚拟模板类和一个派生类。我现在正在尝试对派生类使用 boost::serialisation。到目前为止,这是我的代码:

template <class T> class classOne { 
public:     
    classOne(){};   
    classOne(T val) : st(val){};    
    virtual ~classOne() {};     
    virtual double GetError() =0; 
protected:  T st;
private:
    friend class boost::serialization::access;
    template<class archive>
    void serialize(archive& ar, const unsigned int version)
    {
         ar & BOOST_SERIALIZATION_NVP(st);
    }
}; 
BOOST_SERIALIZATION_ASSUME_ABSTRACT(classOne<double>);

template <class T> class classTwo : public classOne<T>
{
public:
    classTwo() : classOne<T>(1.0), error(0){};
    classTwo(T val) : classOne<T>(val), error(val){};
    virtual T GetError() {return error;};

private:
    T error;
    friend class boost::serialization::access;
    template<class archive>
    void serialize(archive& ar, const unsigned int version)
    {
            ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(classOne<T>);
            ar & BOOST_SERIALIZATION_NVP(error);
    }
};
int main(int argc, char** argv){
   classTwo<double> ch2(0.5);
   std::ofstream ofs2("test2.xml");
   boost::archive::xml_oarchive oa2(ofs2);
   oa2 << BOOST_SERIALIZATION_NVP(ch2);
   ofs2.close();
}

代码编译但在运行时我得到:

terminate called after throwing an instance of 'boost::archive::xml_archive_exception'
    what():  Invalid XML tag name

当 classOne 不是模板类时,一切正常。有人可以帮忙吗?

【问题讨论】:

    标签: c++ templates serialization boost virtual


    【解决方案1】:

    好吧,问题很明显:&lt;&gt; 在 XML 元素标签中表现不佳。

    所以,这就是我天真想到的修复它的方法。

    罢工>

    ar & boost::serialization::make_nvp(
          "base", static_cast<classOne<T>&>(*this));
    

    重要更新但是,就在今天,我偶然发现了这里的文档:

    注意派生类中基类的序列化。 不要直接调用基类序列化函数。这样做似乎可行,但会绕过跟踪写入存储的实例的代码以消除冗余。它还将绕过将类版本信息写入存档。因此,建议始终将成员序列化函数设为私有。

    哎呀。所以这是新的和正确的建议:

        typedef classOne<T> baseClass;
        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(baseClass);
    

    现在,您可以通过使用宏并使用 typedef 隐藏括号来控制 xml 元素的名称。

    输出:

    <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
    <!DOCTYPE boost_serialization>
    <boost_serialization signature="serialization::archive" version="10">
    <ch2 class_id="0" tracking_level="0" version="0">
        <baseClass class_id="1" tracking_level="0" version="0">
            <st>0.5</st>
        </baseClass>
    <error>0.5</error>
    </ch2>
    

    【讨论】:

    • 警告:在发现我的“解决方案”使用了文档中明确不鼓励使用的东西后,我刚刚改变了答案。干杯。
    • @hansgans 干杯。感谢您的反馈:)
    猜你喜欢
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多