BOOST xml_oarchive内存访问错误

时间:2015-04-11 01:47:04

标签: c++ serialization boost xml-serialization

我正在尝试学习boost :: serialization以制作相同的游戏系统,而且我使用text_oarchive格式。我学习了如何将BOOST_CLASS_EXPORT_GUID用于多态类,并使用BOOST_SERIALIZATION_NVP用于xml存档。然后,当我尝试使用xml_oarchive存档格式的多态类组合它们时,我遇到了运行时错误。

错误:enter image description here

我的代码:

#include <fstream>
#include <boost/serialization/serialization.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/export.hpp>

struct base {
    friend class boost::serialization::access;
    //...
    // only required when using method 1 below
    // no real serialization required - specify a vestigial one
    template<class Archive>
    void serialize(Archive & ar, const unsigned int file_version){}

    virtual ~base() { }
};

struct derived : public base {
    friend class boost::serialization::access;

    int i = 93894;


    template<class Archive>
    void serialize(Archive & ar, const unsigned int file_version){
        // method 1 : invoke base class serialization
        ar & BOOST_SERIALIZATION_NVP(boost::serialization::base_object<base>(*this));

        ar & BOOST_SERIALIZATION_NVP(i);
    }

    virtual ~derived() { }
};

BOOST_CLASS_EXPORT_GUID(derived, "derived")


int main()
{

    std::ofstream ofstr("file.txt");
    boost::archive::xml_oarchive oarch(ofstr);

    base* b = new derived();
    oarch << BOOST_SERIALIZATION_NVP(b);

    std::cin.get();

    delete b;
}

所有这些都以text_oarchive格式运行得很漂亮,但当我将其更改为xml_oarchive时,它会崩溃。

我在这里做错了什么,似乎我做了教程告诉我要做的所有事情。

1 个答案:

答案 0 :(得分:0)

好吧,我发现了问题。它根本不与多态性有关。

问题在于这一行

ar & BOOST_SERIALIZATION_NVP(boost::serialization::base_object<base>(*this));

这个问题是boost::serialization::base_object<base>(*this)没有变量名,它用来解析XML标记的名称。当我将完全相同的代码更改为:

ar & boost::serialization::make_nvp("owner", boost::serialization::base_object<base>(*this));

使用make_nvp方法显式生成nvp。这样它就会被赋予一个名称,而不是试图从一个不存在的名称中找出它。