【问题标题】:BOOST xml_oarchive memory access errorBOOST xml_oarchive 内存访问错误
【发布时间】:2015-06-16 20:40:59
【问题描述】:

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

错误:

我的代码:

#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 时,它​​崩溃了。

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

【问题讨论】:

    标签: c++ serialization boost xml-serialization


    【解决方案1】:

    好的,我发现了问题。它根本与多态性无关。

    问题出在这一行

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

    问题在于boost::serialization::base_object&lt;base&gt;(*this) 没有变量名,它用于解析XML 标记的名称。当我将完全相同的代码更改为:

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

    使用 make_nvp 方法显式创建 nvp。通过这种方式,它被赋予了一个名称,而不是试图从一个不存在的名称中找出它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多