这有点奇怪,但我要回答我自己的问题。我刚刚弄清楚如何使上面的示例发挥作用。
这就是解决方案。每次我们需要序列化一个从另一个类继承属性的类时,我们都需要使用宏:
BOOST_CLASS_EXPORT(T)
根据boost序列化文档 http://www.boost.org/doc/libs/1_48_0/libs/serialization/doc/special.html#export
包含任何存档类头的同一源模块中的 BOOST_CLASS_EXPORT 将实例化将指定类型的多态指针序列化到所有这些存档类所需的代码。如果不包含存档类标头,则不会实例化任何代码。
请注意,此功能的实现要求 BOOST_CLASS EXPORT 宏出现在要实例化代码的任何存档类标头之后并包含其中。
所以就我而言,我的 main.cpp 文件现在是:
#include <fstream>
#include <boost\archive\text_iarchive.hpp>
#include <boost\archive\text_oarchive.hpp>
#include <boost\serialization\export.hpp>
#include "Coordinate.h"
#include "Move.h"
#include "MoveNormal.h"
BOOST_CLASS_EXPORT(MoveNormal)
int main(int argc, char *argv[]) {
Coordinate *c = new Coordinate(150);
Move *m = new MoveNormal(c);
std::cout << "m.getDestination().get(): " << m->getDestination()->get() << std::endl;
{
std::ofstream ofs("f.txt");
boost::archive::text_oarchive oa(ofs);
oa << m;
}
Move *n;
{
std::ifstream ifs("f.txt");
boost::archive::text_iarchive ia(ifs);
ia >> n;
}
std::cout << "n.getDestination().get(): " << n->getDestination()->get() << std::endl;
return 0;
}
只需确保在使用导出宏之前包含所需的所有升压档案即可。
除了序列化之外,为了完成我的项目,我需要使用 boost::asio 将它们写入 TCP 套接字。
所以我们假设我有一个像这样的连接标头this one http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio/example/serialization/connection.hpp现在我在 MoveJump.h 中定义了另一个名为 MoveJump 的类
#include <boost\archive\text_iarchive.hpp>
#include <boost\archive\text_oarchive.hpp>
#include "Coordinate.h"
#include "Move.h"
class MoveJump : public Move {
public:
MoveJump() {}
MoveJump(Coordinate *c) { this->destinatio = c; }
~MoveJump() {}
virtual bool isJump(void);
private:
friend class boost::serialization::access;
template<typename Archive>
void serializize(Archive &ar, const unsigned int version) {
ar & boost::serialization::base_object<Move>(*this);
}
};
现在序列化这些结构我的主要看起来像这样
#include <boost\archive\text_iarchive.hpp>
#include <boost\archive\text_oarchive.hpp>
#include <boost\serialization\export.hpp>
#include <fstream>
#include "Coordinate.h"
#include "Move.h"
// And now we register all the possible Moves
#include "MoveNormal.h"
BOOST_CLASS_EXPORT(MoveNormal)
#include "MoveJump.h"
BOOST_CLASS_EXPORT(MoveJump)
int main(int argc, char *argv[]) {
Coordinate *c = new Coordinate(10);
Move *m = new MoveNormal(c);
Coordinate *d = new Coordinate(15);
Move *j = new MoveJump(d);
{
std::ofstream ofs("m.txt");
boost::archive::text_oarchive oa(ofs);
oa << m;
}
{
std::ofstream ofs("j.txt");
boost::archive::text_oarchive oa(ofs);
oa << j;
}
}
诀窍是注册当我们有指向基类的指针时将被序列化的类。
如果在我的 Move.h 中我有更多指向其他基类的指针(我在项目中这样做),我们需要在 main 中包含所有标头并注册扩展基类的所有可能的类。
我希望这对将来可能遇到类似问题的人有所帮助。
请随意提出新的可能解决方案。
Thanks