加载具有不同类布局的旧boost :: serialization存档

时间:2012-09-01 07:33:29

标签: c++ serialization boost

我有一个旧的(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),但这不适用于档案。

2 个答案:

答案 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)

除了为旧版本档案编写转换程序之外,似乎没有办法做到这一点。

然而,现在有了'标题',将来,如果我需要在顶层添加更多类,我可以在其加载函数中使用一些逻辑。