使用 boost 从二进制到 xml 序列化
From binary to xml serialization using boost
我目前正在研究几个 类,它们使用 boost 序列化和二进制存档使用:
my_archive & my_variable;
但是我想添加 xml 存档序列化支持,同时保持向后兼容性。由于这个原因,Boost 强制(当然)使用 nvp 包装器。
不幸的是,似乎不可能在同一个序列化函数(管理版本控制)中混合使用 nvp() 和直接二进制序列化。
到目前为止,我的代码是这样的:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
// serialize base class information
if (version == 4) {
ar & boost::serialization::make_nvp( "var", mVariable );
}
else if (version == 3) {
ar & mVariable;
}
}
与
BOOST_CLASS_VERSION(MyType, 4)
当使用 xml 存档调用 & 运算符时,我在 is_wrapper<>() 上收到模板错误,因为我的一些序列化没有使用 nvp 包装器。
所以这是我的问题,是否有任何解决方法可以让我考虑版本号(在编译时知道)以调整序列化函数以将 xml/binary 用于版本 4 并且仅二进制用于上一个
您应该始终添加 NVP 包装器;它只是一个元数据注释,不用于二进制存档(或标准文本存档,就此而言)。
因此对于二进制存档,您甚至不需要更改版本控制
ar & BOOST_SERIALIZATION_NVP(x);
// or
ar & boost::serialization_make_nvp("foo", x);
完全等同于
ar & x;
我目前正在研究几个 类,它们使用 boost 序列化和二进制存档使用:
my_archive & my_variable;
但是我想添加 xml 存档序列化支持,同时保持向后兼容性。由于这个原因,Boost 强制(当然)使用 nvp 包装器。
不幸的是,似乎不可能在同一个序列化函数(管理版本控制)中混合使用 nvp() 和直接二进制序列化。
到目前为止,我的代码是这样的:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
// serialize base class information
if (version == 4) {
ar & boost::serialization::make_nvp( "var", mVariable );
}
else if (version == 3) {
ar & mVariable;
}
}
与
BOOST_CLASS_VERSION(MyType, 4)
当使用 xml 存档调用 & 运算符时,我在 is_wrapper<>() 上收到模板错误,因为我的一些序列化没有使用 nvp 包装器。
所以这是我的问题,是否有任何解决方法可以让我考虑版本号(在编译时知道)以调整序列化函数以将 xml/binary 用于版本 4 并且仅二进制用于上一个
您应该始终添加 NVP 包装器;它只是一个元数据注释,不用于二进制存档(或标准文本存档,就此而言)。
因此对于二进制存档,您甚至不需要更改版本控制
ar & BOOST_SERIALIZATION_NVP(x);
// or
ar & boost::serialization_make_nvp("foo", x);
完全等同于
ar & x;