c++ - 稳健的 boost::variant 序列化

标签 c++ boost boost-serialization boost-variant

我正在使用 boost::variantboost::serialize在我的申请中。序列化模块内置了对序列化变体的支持,因此:

boost::variant<int,double> u(3.14);

// Do something with u;

// Serialize
oa << u;

有效。但是,我的问题是序列化不可靠。根据我的应用程序的编译方式,变体的元素可能会发生变化。目前,序列化模块似乎只是简单地嵌入了“事件”变体类型的索引;如果变体更改为,比如说 boost::variant<double,string>,这是一个问题.

谁能提出改进方法,以便序列化/反序列化工作,因为已序列化的类型是 boost::variant 的模板参数. (因此,在上述情况下,boost::variant<int,double> u(3.14) 可以反序列化为 boost::variant<double,std::string>。我知道这可能需要我提供其他信息,例如类型的字符串化形式。

最佳答案

这种现成的机制如何运作?例如,如果你改变了 boost::variant<int,double> 它应该做什么至 boost::variant<int,std::string>不能再持有双?抛出异常?

如果您想要这样的东西,我想您必须自己编写它来涵盖您预期的情况并符合您对“稳健”的定义。

您还可以构建一些文件升级逻辑...例如,您程序的每个版本 N 都保留着 (N-1, N-2...) 结构定义的旧拷贝,这样您能够编写可用于提供升级遇到的旧文件的能力的例程。

但实际上,最好是在您将程序投入使用之前,尽可能在第一时间将您的文件格式设置正确!尤其是编码用户意图的数据(如果版本无法识别它们,可以丢弃实际上只是缓存的派生结构并重新计算)。

关于c++ - 稳健的 boost::variant 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8052727/

相关文章:

c++ - 对象如何成为子对象?

c++ - 如何使用 IDA Pro 在 DLL 中找到静态链接函数?

c++ - 如何在 boost multi_array 容器中存储值?

c++ - 使用 boost program_options 处理帮助消息,删除默认值或重新格式化帮助消息

c++ - boost 认识 child

c++ - boost 序列化 - 序列化 std::tr1::shared_ptr?

boost 多边形序列化

c++ - 如何向管道写入更多值并读取它们?

在 Windows 7 x64 上使用 NDK r9b 的 android-cmake

c++ - Boost类序列化,成员类型的改变