我有一个旧的(boost :: serialization)存档,它是使用:
生成的class Data;
data = new Data();
ar & data;
现在代码已更改为:
class Header;
class Data;
header = new Header();
data = new Data();
ar & header;
ar & data;
所以,我的问题:如何使用新代码加载旧存档?据我所知,boost :: serialization不允许存档版本控制,如果我只是尝试要加载它,它会给我一个“输入流错误”,因为它会尝试ar & header;
使用ar & data;
保存的数据。
编辑:我知道BOOST_CLASS_VERSION(ns::Class, x)
,但这不适用于档案。
答案 0 :(得分:2)
提升序列化does allow versioning。不幸的是,您不知道这一点,所以您只需通过使用ar & header
保存新档案而不会破坏类版本来打破向后兼容性。
上面链接的教程很好地解释了它。在您的情况下,当您决定添加header
时,您必须执行以下操作:
class YourClass
{
/* ... */
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
if(version > 0)
ar & header;
ar & data;
}
};
BOOST_CLASS_VERSION(YourClass, 1)
每次更改序列化代码时,您必须使用类的版本,即使您只在最后添加字段。
答案 1 :(得分:0)
除了为旧版本档案编写转换程序之外,似乎没有办法做到这一点。
然而,现在有了'标题',将来,如果我需要在顶层添加更多类,我可以在其加载函数中使用一些逻辑。