11

我正在做的应用程序有问题。我需要使用 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,我看不到使用导出密钥 + 实现的任何优势!

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

4

1 回答 1

14

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

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

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

在 cpp 中:

  • 类定义
  • 类导出: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)archive 应该替换为您正在使用的任何类型的 boost 存档。

希望有一天它会对某人有所帮助(这清楚地写在了boost文档中,但我必须一直错过它直到今天......)

于 2012-10-08T13:27:51.690 回答