Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 加载具有不同类布局的旧boost::Serialization归档_C++_Serialization_Boost - Fatal编程技术网

C++ 加载具有不同类布局的旧boost::Serialization归档

C++ 加载具有不同类布局的旧boost::Serialization归档,c++,serialization,boost,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

我有一个旧的(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\u CLASS\u版本(ns::CLASS,x)
,但这不适用于存档。

BOOST序列化。不幸的是,您不知道这一点,所以您只是通过使用
ar&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)
classyourclass
{
/* ... */
模板
无效序列化(存档和ar,常量未签名整数版本)
{
如果(版本>0)
应收账款&表头;
ar&data;
}
};
BOOST_CLASS_版本(YourClass,1)

每次更改序列化代码时都必须修改类的版本,即使只在末尾添加字段。

因此,除了为旧版本存档编写转换程序外,似乎没有其他方法可以做到这一点


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

编辑了问题,以澄清我所说的是类而不是成员。@Tim:变化不大,您应该在归档开始时保存自己的版本,或者将整个代码包装在一个单独的类中,然后按照上面的步骤进行操作。不管怎么说,既然您事先不关心它,现在就无法修复它并使它神奇地工作。这就是Header类的用途。如果不可能做到这一点,那么我就编写一个档案转换黑客,并在任何旧档案上运行它。@Tim:正如我所说的:“既然你事先不关心它,现在就不能修复它并使它神奇地工作。”只需实现上述方法之一,或者放弃
boost::serialization
。我对此库有足够的问题:。