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++中是“Ch++”还是“ch+1”?

c++ - 如何检查驱动程序代码中的无符号字符指针检查为零?

c++ - 如何在Borland C++中调用返回字符串数组的方法?

c++ - 我可以使用 boost::bind 来存储不相关的对象吗?

c++ - 正确使用 Boost 库需要哪些先验知识?

c++ - 使用相同的 udp 套接字进行异步接收/发送

c++ - 特征矩阵 + Boost::序列化/C++17

c++ - 无法使用boost::serialization和shared_ptr反序列化

c++ - std::mutex 是否足以实现线程间的数据同步

c++ - boost 类序列化,更改成员类型