我在我的应用程序中使用boost::variant
和boost::serialize
。序列化模块内置了对序列化变体的支持,因此:
boost::variant<int,double> u(3.14);
// Do something with u;
// Serialize
oa << u;
的工作原理。但是,我的问题是序列化不健壮。根据我的应用程序的编译方式,变体的元素可能会发生变化。目前序列化模块似乎只是嵌入了'active'变体类型的索引;如果变体更改为boost::variant<double,string>
。
任何人都可以提出改进方法,以便序列化/非序列化工作,因为已序列化的类型是boost::variant
的模板参数。 (因此,在上述情况下,boost::variant<int,double> u(3.14)
可以未序列化为boost::variant<double,std::string>
。我知道这可能要求我提供其他信息,例如类型的字符串形式。
答案 0 :(得分:3)
这种东西的现成机制如何运作?例如,如果您将boost::variant<int,double>
更改为boost::variant<int,std::string>
并且无法再保留双倍,该怎么办?抛出异常?
如果您想要这样的东西,我想您必须自己编写,以涵盖您所预期的案例并符合您对“强大”的定义。
您也可以构建一些文件升级逻辑...例如,程序的每个版本N都会保留(N-1,N-2 ...)结构定义的旧副本,这样您就可以了能够编写可用于提供升级遇到的旧文件的能力的例程。
但实际上,最好尽可能第一次让你的文件格式正确,然后让程序进入疯狂状态!特别是编码用户意图的数据(如果版本无法识别,则可以丢弃并重新计算有效缓存的派生结构)。