Opencl 通过自定义函数序列化联合类型:“0”;静态断言失败::typex::value“;

Opencl 通过自定义函数序列化联合类型:“0”;静态断言失败::typex::value“;,opencl,boost-serialization,Opencl,Boost Serialization,我正在序列化OpenCL中的cl\u long2类型,其定义如下(简化自/usr/include/cl/cl\u platform.hpp): 我定义了以下独立序列化函数: namespace boost{ namespace serialization { template<class Archive> void serialize(Archive &ar, cl_long2 &i, const unsigned version){ ar & make

我正在序列化OpenCL中的
cl\u long2
类型,其定义如下(简化自
/usr/include/cl/cl\u platform.hpp
):

我定义了以下独立序列化函数:

namespace boost{ namespace serialization {
template<class Archive> void serialize(Archive &ar, cl_long2 &i, const unsigned version){
   ar & make_nvp("x",i.x);
   ar & make_nvp("y",i.y);
}

}};
namespace boost{namespace序列化{
模板无效序列化(存档和应收账款、cl_long2&i、常量未签名版本){
ar&make_nvp(“x”,i.x);
应收账款和制造nvp(“y”,即y);
}
}};
当我编译代码(作为类成员调用cl_long2的序列化)时,我得到了以下错误,我无法理解(如果它不是
std::vector
,只是一个独立变量,则错误是相同的):

/usr/include/boost/archive/detail/check.hpp:在函数“void boost::archive::detail::check_object_level()[with T=cl_long2]”中:

/usr/include/boost/archive/detail/iseralizer.hpp:438:9:从“static void boost::archive::detail::load_non_pointer_type”实例化,如果查看断言失败的行(:60),它的正上方有一条注释:

// trap attempts to serialize objects marked
// not_serializable
BOOST_STATIC_ASSERT(typex::value);
说明必须首先启用此
long2
类型。正如您所发现的,这是通过以下方式完成的:

BOOST_CLASS_IMPLEMENTATION(long2,boost::serialization::object_serializable)

顺便问一下,“BOOST\u NO\u INT64\u T”定义了吗?不,它没有定义(我在BOOST头中搜索过,它也不存在)
int64_t
是一种系统定义的类型(带有gcc工具链的Linux)。仔细看断言行,它说“陷阱试图序列化标记为不可序列化的对象”。您应该特别关注“not_serializable”属性,它是出于某种原因为您的数据类型设置的。我添加了一个简单的示例(struct o serialize更小,只是一个并集)。我认为只要提供序列化功能,boost::serialization就可以处理联合。@Pompei2:很好,添加
boost\u CLASS\u实现(long2,boost::serialization::object\u serializable)
解决了这个问题。谢谢你能把它贴在我能接受的地方吗?
// trap attempts to serialize objects marked
// not_serializable
BOOST_STATIC_ASSERT(typex::value);
BOOST_CLASS_IMPLEMENTATION(long2,boost::serialization::object_serializable)