Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost二进制序列化不';我不偶尔工作。解析的数据有时会损坏_C++_Serialization_Boost_Binary - Fatal编程技术网

C++ Boost二进制序列化不';我不偶尔工作。解析的数据有时会损坏

C++ Boost二进制序列化不';我不偶尔工作。解析的数据有时会损坏,c++,serialization,boost,binary,C++,Serialization,Boost,Binary,由于未知的原因,boost二进制序列化偶尔不起作用。解析的数据有时会损坏 最初,我手动序列化了自定义类的实例,每个实例都是文本文件中的一行。但是,速度很慢。(文本文件的处理速度为2 MB/秒,这可以在windows任务管理器中看到。)最近我改为使用boost二进制序列化。然而,奇怪的事情发生了 我存储了许多InstanceIdentity类的实例,其中包含一个字符串成员变量和一个表示x-y-z整数坐标的struc成员变量 我的问题是:前面的504个实例可以成功地从二进制文件中解析并打印到屏幕上。

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

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

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

我的问题是:前面的504个实例可以成功地从二进制文件中解析并打印到屏幕上。但是,第505个实例被错误地解析(x-y-z坐标不应超过512),然后下面的实例就会变得一团糟。很快boost就会抛出一个未知异常。我试图捕捉它,并使用.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.
我试图解决它

  • 我检查了这一页。我确保ifstream和ofstream以二进制形式打开:

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

    in|file_stream.open(文件名,ios_base::in | ios_base::binary)

  • 但问题仍然存在

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

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

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

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

    //我可以在适当的位置找到0000A900004F

    //第502实例x-y-z

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

    //但是我在整个二进制文件中找不到00 00 89 00 00 01 0c 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=0xE0154=0x9A 86=0x56

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

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

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

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

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

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


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

    您是否以二进制模式(
    ios::binary
    )打开二进制文件流?如果你在文本模式下打开它们,任何随机的CR/LF都可能被翻译。我在ios_base::binary模式下打开了它们。我认为ios::binary也是如此。正如我在问题中所说:
    out_file_stream.open(文件名,ios_base::out | ios_base::binary);in|file_stream.open(文件名,ios_base::in | ios_base::binary)@TheDark非常感谢。结果是我在if-else条款中犯了错误。你的猜测是对的。“这件事怎么会发生?有人有什么好主意来防止这种错误吗?”-这是一个百万美元的问题!这是一个简单的“一对一”或“布尔”反转,除了首先避免这种情况并使用经过良好测试的现有(库)功能外,没有其他方法可以防止它。在这种情况下,最明显的想法是以二进制模式打开所有文件。我强烈认为它也适用于文本文件(只有当代码不能处理非本机行结尾时,这种差异才与平台无关的程序非常相关。我希望Boost能够很好地处理它们)。