提升二进制序列化偶尔也不起作用。解析的数据有时会被破坏

时间:2015-09-27 03:07:28

标签: c++ serialization boost binary

由于未知原因,促进二进制序列化偶尔也不起作用。解析的数据有时会被破坏。

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

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

我的问题:可以成功地从二进制文件中解析前面的504个实例并将其打印到屏幕上。然而,错误地解析了第505个实例。(x-y-z坐标应该不超过512.)然后以下实例变得混乱。很快,一个未知的异常就会被提升。我试图抓住它并使用.what()方法来揭示更多信息。但是,它只说Unknown Exception

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(file_name,ios_base :: out | ios_base :: binary);

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

  2. 但问题还在继续。

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

      1. 我在十六进制编辑器(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 00 e0 00 00 00 9a 00 00 00 56

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

      2. 问题: 有人知道在boost二进制文件中发生了什么吗? 我该怎么做才能将我的实例序列化为二进制文件并从中反序列化它们? 我使用的是同一台计算机,所以我认为这个问题与可移植性无关。

        环境: Windows 8 64位,visual studio 2013,提升1_59_0版本。

1 个答案:

答案 0 :(得分:3)

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

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

PS:我花了两天时间找到问题的根源,在此期间我多次检查了错误的if-else条款,但忽略了错误。怎么会发生这件事?有没有人有一些好的想法来防止这类错误?