将std::vector序列化为Boost二进制存档时,数据相关的失败

Data-Dependent Failure When Serializing std::vector to Boost Binary Archive

本文关键字:数据 失败 vector std 序列化 二进制 Boost      更新时间:2023-10-16

刚刚开始熟悉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.

这是可能的,你的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);