Serialization 推进序列化:归档”;“不支持的版本”;例外

Serialization 推进序列化:归档”;“不支持的版本”;例外,serialization,boost,archive,Serialization,Boost,Archive,当我试图通过文本存档反序列化以前使用较高版本的Boost序列化的某些数据(1.46用于序列化,1.38用于反序列化)时,出现异常“unsupported version”…是否有方法降级(在代码中)序列化 类似于“设置库版本”之类的内容。有关序列化错误,请参阅邮件存档文章 它说下面的代码完成了这项工作: void load_override(version_type & t, int version){ library_version_type lvt = this->g

当我试图通过文本存档反序列化以前使用较高版本的Boost序列化的某些数据(1.46用于序列化,1.38用于反序列化)时,出现异常“unsupported version”…是否有方法降级(在代码中)序列化

类似于“设置库版本”之类的内容。

有关序列化错误,请参阅邮件存档文章

它说下面的代码完成了这项工作:

void load_override(version_type & t, int version){

    library_version_type lvt = this->get_library_version();
    if (boost::archive::library_version_type(7) < lvt){
        this->detail_common_iarchive::load_override(t, version);
    }
    else
        if (boost::archive::library_version_type(6) < lvt){
            uint_least16_t x = 0;
            * this->This() >> x;
            t = boost::archive::version_type(x);
        }
        else
            if (boost::archive::library_version_type(3) == lvt ||
                boost::archive::library_version_type(5) == lvt){

                #pragma message("CTMS fix for serialization bug (lack of backwards compatibility) introduced by Boost 1.45.")
                // Up to 255 versions
                unsigned char x = 0;
                * this->This() >> x;
                t = version_type(x);
            }
            else{
                unsigned int x = 0;
                * this->This() >> x;
                t = boost::archive::version_type(x);
            }
}
void load\u覆盖(版本类型&t,int版本){
library_version_type lvt=this->get_library_version();
if(boost::archive::library\u version\u type(7)详细说明公共配置::加载覆盖(t,版本);
}
其他的
if(boost::archive::library\u version\u type(6)this()>>x;
t=boost::archive::version\u type(x);
}
其他的
如果(boost::archive::library\u version\u type(3)=lvt||
boost::archive::library\u version\u type(5)=lvt){
#pragma消息(“Boost 1.45引入的序列化错误(缺乏向后兼容性)的CTMS修复。”)
//最多255个版本
无符号字符x=0;
*this->this()>>x;
t=版本类型(x);
}
否则{
无符号整数x=0;
*this->this()>>x;
t=boost::archive::version\u type(x);
}
}

使用文本存档。。。我最近也有一个问题。 我最近在Windows上将boost从1.67升级到1.72,并在Windows上生成了一些数据。当我在仍然使用Boost 1.67的Linux环境中运行数据时,它抛出不受支持的

1.67的标题如下所示

22 serialization::archive 16
1.72看起来像

22 serialization::archive 17

我将17改为16,它为我的用例感到高兴。

首先,感谢您的回复…但实际上我没有使用加载/保存函数,而是使用一个名为serialize的独特函数…如boost serialization示例…我该怎么做?链接中谈到了这一点。它说向后兼容性被破坏了“在1.44之前,存档版本被写为“一个字节”。从1.44开始,存档版本类型从“版本类型”更改为“库版本类型”,预计将被读取为两个字节。“仔细阅读链接,并使用我粘贴的代码重新编译。我认为这是唯一的解决办法。只能作为数据恢复黑客进行此操作。您正在冒着未定义行为的风险(事实上,您已经处于未指定的领域,只是幸运的是它看起来仍然做一些合理的事情。如果您必须这样做,请使用ASAN/UBSAN运行并三次检查结果)