我正在尝试学习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时,它会崩溃。
我在这里做错了什么,似乎我做了教程告诉我要做的所有事情。
答案 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。这样它就会被赋予一个名称,而不是试图从一个不存在的名称中找出它。