可能的重复:
使用多态档案增强序列化
我试图使用指向派生类的基指针来序列化我的类,但这仅序列化基类。
我刚刚读过http://www.boost.org/doc/libs/1_32_0/libs/serialization/doc/special.html#registration,但是导出宏和寄存器函数似乎都没有改变任何东西。
考虑以下非常基本的类层次结构:
#include <iostream>
#include <fstream>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
class A
{
private:
friend class boost::serialization::access;
template <typename Archive>
void serialize(Archive& ar, const unsigned int version)
{
std::cout << "A!\n";
}
};
class B : public A
{
private:
friend class boost::serialization::access;
template <typename Archive>
void serialize(Archive& ar, const unsigned int version)
{
ar & boost::serialization::base_object<A>(*this);
std::cout << "B!\n";
}
};
int main()
{
std::ofstream of("mybin.bin");
boost::archive::binary_oarchive oa(of);
A* b = new B();
oa << b;
delete b;
return 0;
}
输出将是:
A!
显然,我正在寻找的输出是 A!乙!有什么办法可以实现这一点吗?
EDIT:好吧,看了评论里的相关条目,事情是这样的。
有 3 件事需要改变:
- A类应该有一个虚函数,这样它就被认为是多态的
- 需要导出派生类。 BOOST_CLASS_EXPORT(B)
- oa
它与标准的binary_oarchive以及polymorphic_binary_oarchive一起使用。
EDIT2:当我有 b.cpp(.h) 和 main.cpp 时,BOOST_CLASS_EXPORT 会导致重复的符号:
重复符号 boost::archive::detail::extra_detail::init_guid::g
我必须承认我对此并不熟悉boost
包,但我复制并编译了代码,产生了与提到的OP相同的结果
意识到我们正在使用多态性,我添加了一个public: virtual ~A(){};
in class A
. Also, oa.register_type<B>();
添加到main
根据该文件,输出变为:
A!
B!
根据规范,一个类是一个polymorphic class
只有当declares or
inherits a virtual function
。对于非多态类,也许多态性不起作用。
EDIT:
把BOOST_CLASS_EXPORT(B);
in B.cpp
代替B.h
似乎可以解决这个重新定义的问题。
EDIT:
检查了扩展结果BOOST_CLASS_EXPORT(B)
(重新格式化):
namespace boost {
namespace serialization {
template<> struct guid_defined<B> : boost::mpl::true_ {};
template<> inline const char * guid<B>(){ return "B"; }
}
}
namespace boost {
namespace archive {
namespace detail {
namespace { // NOTE
template<> struct init_guid< B > {
static guid_initializer< B > const & g;
};
guid_initializer< B > const & init_guid< B >::g = ::boost::serialization::singleton< guid_initializer< B > >::get_mutable_instance().export_guid();
}
}
}
}
对于标有的行NOTE
:对于boost 1.42,使用的是匿名命名空间,如果将其放入多个cpp文件或放入头文件中,则没有问题(在ubuntu中使用g++进行测试,使用Ubuntu附带的boost包)。然而,在boost 1.48中,namespace extra_detail
使用,当放入多个cpp文件时会出现问题(在VS2010的windows中测试,使用从主页下载的boost)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)