c++ - 使用 boost 从二进制到 xml 序列化

标签 c++ xml serialization boost binary

我目前正在研究几个使用 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 包装器。

所以这是我的问题,是否有任何解决方法可以让我考虑版本号(在编译时知道)以调整序列化函数以对版本 4 使用 xml/二进制文件,而对前一个版本仅使用二进制文件。

最佳答案

您应该始终添加 NVP 包装器;它只是一个元数据注释,不用于二进制存档(或标准文本存档,就此而言)。

因此,对于二进制存档,您甚至不需要更改版本控制

ar & BOOST_SERIALIZATION_NVP(x);
// or
ar & boost::serialization_make_nvp("foo", x);

完全等同于

ar & x;

关于c++ - 使用 boost 从二进制到 xml 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30931888/

相关文章:

c# - 仅在 C# 中验证 XML 语法

xml - 动态 JAXB XML 反序列化(解码)

java - 尽管我已经实现了 'Serializable',但为什么我收到 NotSerializedException 异常

android - 如何将 Firebase DataSnapshot 对象保存到共享首选项?

c++ - 运算符重载和继承

c++ - 使用 Win32 API 和 GDI 绘制窗口的无效区域

c++ - 从父 CMakeLists.txt 覆盖 CMake 中的默认选项(...)值

c++ - 是否有任何应用程序具有 HWND?

c# - 在 C# 中,如何将 POCO 序列化为带有大量花哨标记的 XML?

json - 在Play中自定义JSON序列化