c++ - Boost 二进制序列化有时不起作用。解析的数据有时会损坏

标签 c++ serialization boost binary

由于未知原因,boost 二进制序列化偶尔无法工作。解析的数据有时会损坏。

最初我手动序列化了自定义类的实例,每个实例都是文本文件中的一行。不过速度很慢。(处理文本文件的速度为2MB/秒,在windows任务管理器中可以看到。)最近我改用boost二进制序列化。然而,奇怪的事情发生了。

我存储了许多InstanceIdentity类的实例,其中包含一个字符串成员变量和一个表示x-y-z整数坐标的struc成员变量。

我的问题:可以成功从二进制文件中解析前面的 504 个实例并将其打印到屏幕上。然而,第 505 个实例被错误解析。(x-y-z 坐标不应超过 512。)然后接下来的实例变得一团糟。很快,Boost 抛出了一个未知的异常。我 try catch 它并使用 .what() 方法来揭示更多信息。但是,它只显示未知异常

line 503: 029_4_.s_raw.gz (306, 215, 64)
line 504: 029_4_.s_raw.gz (224, 154, 86)
line 505: 029_4_.s_raw.gz (68109, 36608, 16384)
// Then the screen output becomes a mess. I can't even copy the mess here.

我尝试解决这个问题。

  1. 我检查了此页面http://boost-users.boost.narkive.com/70Yjldp7/boost-serialization-throws-random-exceptions 。我确保 ifstream 和 ofstream 以二进制形式打开:

    out_file_stream.open(文件名, ios_base::out | ios_base::binary);

    in_file_stream.open(file_name, ios_base::in | ios_base::binary);

但问题仍然存在。

  • 我尝试使用 boost 在文本文件中序列化相同的数据。 (只需更改文件打开模式和boost存档类型。)
  • 通过文本文件可以成功序列化和反序列化数据。由于这可能意味着我的自定义类 InstanceIdentity 中的序列化函数的正确性,因此 boost 二进制序列化的问题变得更加奇怪。

  • 我在十六进制编辑器(notepad++ 插件)中打开了 boost 二进制文件,并试图在第 505 个实例中找到一些内容。 第 504 个实例的 xyz 坐标的十六进制为:

    //第一个实例 x-y-z

    169=0xA9 144=0x90 79=0x4F

    //我可以在适当的位置找到 00 00 00 a9 00 00 00 90 00 00 00 4f。

    //第 502 个实例 x-y-z

    137=0x89 268=0x10C 136=0x88

    //但我在整个二进制文件中找不到 00 00 00 89 00 00 01 0c 00 00 00 88,即使这个实例被 boost 正确解析了。

    //第 503 个实例 x-y-z

    306=0x132 215=0xD7 64=0x40

    //但我在整个二进制文件中找不到 00 00 01 32 00 00 00 d7 00 00 00 40,即使这个实例被 boost 正确解析了。

    //第 504 个实例 x-y-z

    224=0xE0 154=0x9A 86=0x56

    00 00 00 e0 00 00 00 9a 00 00 00 56

    //但我在整个二进制文件中找不到 00 00 00 e0 00 00 00 9a 00 00 00 56,即使这个实例被 boost 正确解析了。

  • 问题: 有谁知道 boost 二进制文件中发生了什么? 我应该如何将实例序列化为二进制文件并从中反序列化它们? 我使用的是同一台计算机,所以我认为这个问题与便携性无关。

    环境: Windows 8 64 位、Visual Studio 2013、Boost 1_59_0 版本。

    最佳答案

    我非常非常抱歉发布这个问题。 boost 二进制序列化按预期工作。我只是犯了一个小错误,但直到几分钟前才发现。

    我可能是世界上最愚蠢的程序员。在我的函数中,我使用 bool 参数identity_file_in_binary让用户选择是否首选二进制文件。然后我使用 if-else 子句在不同模式下运行 .open()。我应该在 if 范围中使用 iso_base::binary ,但错误地将其放在 else 范围中。改正这个错误后,我的程序运行顺利。

    PS:我花了两天时间寻找问题的根源,期间我多次检查了错误的 if-else 子句,但忽略了这个错误。怎么会发生这种事呢?有没有人有一些好主意来防止此类错误?

    关于c++ - Boost 二进制序列化有时不起作用。解析的数据有时会损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32804174/

    相关文章:

    c++ - 如果 <iostream> 函数失败会怎样?

    c++ - 简单对比一下left和right stops working namespace std is not used

    c++ - 将flex生成的代码放到一个普通的C++程序中

    c++ - AVX、SSE 总和比 gcc 自动向量化慢

    c# - 从 Dictionary<string,object> 初始化类型为 T 的对象

    c++ - 链接到 boost::thread 失败

    c++ - 在 C++11 中反序列化 DNS 数据包对象

    java Spring 。棘手的 json 和 xml 序列化注释

    c++ - 可能未初始化的局部指针变量 'v',用于boost同构。

    C++ 我可以在没有计时器的情况下制作 boost::asio 连接套接字吗?