【发布时间】:2011-12-02 03:05:48
【问题描述】:
我正在尝试使用指向派生类的基指针序列化我的类,但这只会序列化基类。
我刚看了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!乙!有什么办法可以实现吗?
编辑:好的,在查看了 cmets 中的相关条目之后,这是发生了什么。
有 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
【问题讨论】:
-
序列化函数不应该是
virtual吗? -
查看我的编辑,仍然无法使用多态存档器和 boost_class_export
-
@fefe:没有虚拟模板函数这样的东西。
标签: c++ serialization boost