序列化 std::vector 以提升二进制存档时的数据相关失败

Posted

技术标签:

【中文标题】序列化 std::vector 以提升二进制存档时的数据相关失败【英文标题】:Data-Dependent Failure When Serializing std::vector to Boost Binary Archive 【发布时间】:2014-06-19 17:59:37 【问题描述】:

刚开始熟悉 Boost 序列化库。我对似乎与数据相关的故障感到困惑:

以下代码因input stream error 而失败

#include <cassert>
#include <vector>
#include <iostream>
#include <algorithm>
#include "boost/serialization/vector.hpp"
#include "boost/archive/text_iarchive.hpp"
#include "boost/archive/text_oarchive.hpp"
#include "boost/archive/binary_iarchive.hpp"
#include "boost/archive/binary_oarchive.hpp"

int main (void) 

    std::vector<int> v1(100);
    std::generate(v1.begin(), v1.end(), &std::rand);

    
        std::ofstream ofs("test.out");
        boost::archive::binary_oarchive oa(ofs);
        oa << v1;
    

    
        std::vector<int> v2;
        std::ifstream ifs("test.out");
        boost::archive::binary_iarchive ia(ifs);
        ia >> v2;
        assert(v1 == v2);
    

    return 0;

如果我使用boost::archive::text_[i/o]archive,则代码通过。

如果我注释掉std::generate 行(仍然使用binary_[i/o]archive),则代码通过。

从表面上看,这几乎是难以置信的。更有可能的是,我遗漏了一些明显的东西。

最后,使用 1.53。

【问题讨论】:

【参考方案1】:

您的 fstream 可能正在将二进制流中出现的 0x0a 字节转换为不是 0x0a 的系统行结束序列。尝试使用std::ios::binary 模式打开文件,例如

    std::ofstream ofs("test.out", std::ios::out | std::ios::binary);

    std::ifstream ifs("test.out", std::ios::in | std::ios::binary);

【讨论】:

我也赌这个

以上是关于序列化 std::vector 以提升二进制存档时的数据相关失败的主要内容,如果未能解决你的问题,请参考以下文章

Archiving

提升序列化:归档“不支持的版本”异常

如何使用 boost::serialization 序列化 std::vector?

std::vector<float> 成员的 boost 序列化/反序列化失败

将数据从结构二进制复制到 std::vector

从 boost 序列化档案中构造对象