boost序列化和register_type

时间:2012-10-03 11:25:23

标签: c++ serialization boost export

我在正在进行的应用程序中遇到问题。我需要使用boost序列化序列化一些数据包。根据文档,可以分别使用BOOST_CLASS_EXPORT_KEYBOOST_CLASS_EXPORT_IMPLEMENT到.hpp和.cpp文件中,以便能够使用多态基指针来序列化派生类。

所以这就是我所拥有的:

.hpp:包含我的班级声明,最后是BOOST_CLASS_EXPORT_KEY(mynamespace::mypacket)

.cpp:包含我的班级定义和BOOST_CLASS_EXPORT_IMPLEMENT(mynamespace::mypacket)

到目前为止一切运行良好但是当需要序列化时,我得到一个bad_alloc错误。

我通过在我需要使用的存档上显式调用方法register_type<mypacket>()解决了这个问题。

但这是我的问题:boost的EXPORT *是否意味着避免调用register_type方法或者我做错了什么?我觉得在我的代码中做了两次相同的工作,但是如果我们仍然需要在归档后使用register_type,那么我没有看到使用导出密钥+实现的任何优势!

我在这里和其他地方阅读了其他一些帖子,似乎我不是唯一一个试验这个问题的人,但我还没有找到任何答案。

1 个答案:

答案 0 :(得分:10)

我想出了如何避免在归档时调用register_type。对于那些可能感兴趣的人,需要进行模板序列化专业化以及导出密钥+实现。

所以这就是你的.hpp应该是这样的:

  • 类声明(mynamespace :: myclass)
  • 班级导出:BOOST_CLASS_EXPORT_KEY(mynamespace::myclass)

在cpp:

  • class definiton
  • 班级导出:BOOST_CLASS_EXPORT_IMPLEMENT(mynamespace::myclass)
  • AND:serialize()您需要使用的存档的成员专业化,适用于每个类:

template void mynamespace::mypacket::serialize(boost::archive::text_iarchive& arch, const unsigned int version);

template void mynamespace::mypacket::serialize(boost::archive::text_oarchive& arch, const unsigned int version);

应将boost :: archive :: text_(i / o)存档替换为您正在使用的任何类型的存档文件。

希望有一天它会帮助某人(这显然写在boost documentation,但我一定错过了直到今天......)