【问题标题】:Boost serialization: archive "unsupported version" exceptionBoost 序列化:存档“不支持的版本”异常
【发布时间】:2011-08-26 07:10:37
【问题描述】:

当我尝试通过文本存档反序列化之前使用 Boost 的更高版本(1.46 序列化和 1.38 反序列化)序列化的一些数据时,我遇到了异常“不支持的版本”。 .有没有办法降级(在代码中)序列化?

类似“set_library_version”的东西?

【问题讨论】:

    标签: serialization boost archive


    【解决方案1】:

    请参阅 Error read binary archive, created by old Boost 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);
                }
    }
    

    【讨论】:

    • 首先,感谢您的回复...但实际上我没有使用加载/保存功能,而是一个称为序列化的独特功能...就像boost序列化示例...如何我愿意吗?
    • 链接谈到了这一点。它说向后兼容性被破坏了“在 1.44 之前,存档版本被写为“一个字节”。从 1.44 开始,存档版本类型从 'version_type' 更改为 'library_version_type',预计会被读取为两个字节。“阅读仔细链接并使用我粘贴的代码重新编译。我认为这是唯一的解决方案。
    【解决方案2】:

    使用 text_archive ...我最近也遇到了这个问题。 我最近在 Windows 上将 boost 从 1.67 升级到 1.72,在 Windows 上生成了一些数据。当我在仍在 Boost 1.67 上的 Linux 环境上运行数据时,它会抛出 not supported

    1.67 的标头看起来像这样

    22 serialization::archive 16
    

    和 1.72 看起来像

    22 serialization::archive 17
    

    我将 17 更改为 16,这对我的用例很满意。

    【讨论】:

    • 呃。仅将此作为数据恢复黑客。您冒着未定义行为的风险(事实上,您已经处于未指定的领域,幸运的是它看起来仍然在做一些明智的事情。如果您必须这样做,请使用 ASAN/UBSAN 运行并三重检查结果)
    猜你喜欢
    • 1970-01-01
    • 2011-08-21
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    相关资源
    最近更新 更多