我在正在进行的应用程序中遇到问题。我需要使用boost序列化序列化一些数据包。根据文档,可以分别使用BOOST_CLASS_EXPORT_KEY
和BOOST_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,那么我没有看到使用导出密钥+实现的任何优势!
我在这里和其他地方阅读了其他一些帖子,似乎我不是唯一一个试验这个问题的人,但我还没有找到任何答案。
答案 0 :(得分:10)
我想出了如何避免在归档时调用register_type。对于那些可能感兴趣的人,需要进行模板序列化专业化以及导出密钥+实现。
所以这就是你的.hpp应该是这样的:
BOOST_CLASS_EXPORT_KEY(mynamespace::myclass)
在cpp:
BOOST_CLASS_EXPORT_IMPLEMENT(mynamespace::myclass)
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,但我一定错过了直到今天......)