c++ - boost binary_iarchive 读取的数据不正确

标签 c++ boost-serialization

我正在尝试从二进制文件中读取自定义数据

#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <fstream>

struct Data 
{
    int xs, ys;
    double ullat, ullon, lrlat, lrlon;
    double minval, maxval;

   // and some vector of floats
};

namespace boost { 
namespace serialization {

template <class Archive>
void
serialize (Archive& ar, Data& d, const unsigned int version)
{
    ar & d.xs & d.ys;
    ar & d.ullat & d.ullon & d.lrlat & d.lrlon;
    ar & d.minval & d.maxval;
}

} // namespace serialization
} // namespace boost

int main (void)
{
    std::ifstream fin ("test.bin", std::ios::in | std::ios::binary);

    // the binary file was not created by boost serialization library. No header information
    boost::archive::binary_iarchive arc (fin, boost::archive::no_header); 

    Data d;
    arc >> d;
}

在此之后,d 包含垃圾值(巨大的 -ve 或 +ve 数字)。

如果我使用 fstream::read 按照 d 的布局读取文件,我会得到正确的值。我无法弄清楚这里发生了什么。正如我在代码中评论的那样,二进制文件不是由 boost 序列化库创建的。因此使用 no_header 标志。

我使用十六进制查看器工具(Linux 上的 ghex)检查了二进制文件,fstream::read 返回了正确的值。这里可能出了什么问题?

我正在使用 gcc-8.3 和 VS2017 以及 boost 1.70 和 c++17

最佳答案

As I commented in the code, the binary file was not created by boost serialization library.

在这种情况下,您将无法使用 boost::archive::binary_iarchive 读取文件,除非您的文件碰巧共享完全相同的二进制格式。

您需要为 Loading Archive Concept 创建一个新的实现正如 Boost 所说的那样。换句话说,一个新的 archive 类型(至少用于加载)与您当前的格式相匹配。

Hence using no_header flag.

此标志仅跳过 boost::archive::binary_oarchive 为检查大小/字节序等而写入的 header ,但它无法在不知道其格式的情况下读取您的数据。这就是您必须编写自己的存档的原因。

关于c++ - boost binary_iarchive 读取的数据不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58249411/

相关文章:

c++ - 通过取消引用的基类指针 boost 序列化

c++ - 指向 objc 类成员方法的函数指针,用于 C++?

c++ - 使用单独的 Boost 库编译,无需安装 Boost

c++ - g++ 4.7.1 编译错误 : conflicting types for ‘strsignal’

c++ - 使用 boost::serialization 跳过层次继承中的中间类

c++ - 最终子类错误的基类的Boost序列化

c++ - 模板特化的成员函数类型

c++ - 向 Gtk create 方法发送参数

c++ - boost 序列化的编译错误

c++ - 嵌套结构的 boost 序列化不起作用