1

我有一个旧的 (boost::serialisation) 存档,它是使用以下方法生成的:

class Data;
data = new Data();
ar & data;

现在代码已更改为:

class Header;
class Data;
header = new Header();
data = new Data();
ar & header;
ar & data;

所以,我的问题是:如何使用新代码加载旧存档? 据我所知, boost::serialisation 不允许存档版本控制,如果我只是尝试加载它,它会给我一个“输入流错误”,因为它会尝试ar & header;处理已保存的数据与ar & data;.

编辑:我知道BOOST_CLASS_VERSION(ns::Class, x),但这不适用于档案。

4

2 回答 2

2

Boost 序列化确实允许版本控制。不幸的是,您不知道这一点,因此您只是通过保存新档案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)

每次更改序列化代码时都必须更改类的版本,即使您仅在末尾添加字段也是如此。

于 2012-09-01T08:27:32.273 回答
0

所以似乎除了为旧版本的档案写一个转换程序外,没有别的办法。

但是,现在有了“标题”,将来,如果我需要向顶层添加更多类,我可以修改它的版本并在我的加载函数中使用一些逻辑。

于 2012-09-02T13:28:33.030 回答