boost::container::vector 无法用谷物序列化?

boost::container::vector cannot be serialized with Cereal?

本文关键字:序列化 container vector boost      更新时间:2023-10-16

我正在尝试使用 Cereal 序列化boost::container::vector<int>(我知道 boost 提供了一个类似于 Cereal 的序列化库,但整个项目使用 Cereal,它只有一个角落恰好依赖于 boost 向量(。

我已经为boost::container::vector<int>定义了模板化的saveload函数,但 Cereal 失败并出现静态断言,指出它找不到函数的保存/加载对、序列化函数或 save_minimal/load_minimal 对函数。

下面是演示此问题的简单代码。为了进行比较,我还定义了一个模板结构myStruct,它采用相同类型的模板参数作为boost::container::vector,以检查相同的代码是否适用于我自己的类型。

#include <cereal/archives/binary.hpp>
#include <sstream>
#include <boost/container/vector.hpp>
namespace bc = boost::container;
template<typename T, typename V = void, typename W = void>
struct myStruct {};
template<typename A>
void save(A& ar, const myStruct<int>& v) {}
template<typename A>
void load(A& ar, myStruct<int>& v) {}
template<typename A>
void save(A& ar, const bc::vector<int>& v) {}
template<typename A>
void load(A& ar, bc::vector<int>& v) {}
int main()
{
std::stringstream ss;
{
cereal::BinaryOutputArchive oarchive(ss);
bc::vector<int> myData;
//myStruct<int> myData;
oarchive(myData); 
}
{
cereal::BinaryInputArchive iarchive(ss); 
bc::vector<int> myData;
//myStruct<int> myData;
iarchive(myData); 
}
}

编辑:请注意,我也试图重新定义CEREAL_SERIALIZE_FUNCTION_NAMECEREAL_LOAD_FUNCTION_NAME,并在包含任何谷物标头之前CEREAL_SAVE_FUNCTION_NAME,因为我认为saveload方法可能与 boost 提供的函数冲突,但即使使用重命名的函数也不起作用。

您必须在namespace cerealnamespace boost::container中定义save/load函数。