提升二进制序列化偶尔不起作用。解析的数据有时会损坏
Boost binary serialization doesn't work occasionally. The parsed data is corrupted sometimes
由于未知的原因,boost二进制序列化有时不能工作。解析后的数据有时会损坏。
最初,我手动序列化自定义类的实例,每个实例是文本文件中的一行。然而,速度很慢。(文本文件的处理速度为2mb/秒,可以在windows任务管理器中看到。)最近我改为使用boost二进制序列化。然而,奇怪的事情发生了。
我存储了InstanceIdentity类的许多实例,它包含一个字符串成员变量和一个表示x-y-z整数坐标的结构成员变量。
我的问题:前面的504个实例可以从二进制文件中成功解析并打印到屏幕上。然而,第505个实例被错误地解析了。(x-y-z坐标不应超过512。)接下来的例子就变得一团糟了。很快,从boost抛出了一个未知异常。我试图抓住它,并使用。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.
我的尝试解决它。
我检查了这个页面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:: | ios_base::二进制);
但是问题还在继续。
- 我试图在文本文件中使用boost序列化相同的数据。(只需要更改文件打开模式和boost归档类型)
我在十六进制编辑器(notepad++插件)中打开了boost二进制文件,并试图在第505个实例中找到一些东西。504实例的xyz坐标的十六进制是:
//第一个实例
169=0xA9 144=0x90 79=0x4F
//我可以在适当的位置找到00 000 000 a9 00 000 000 000 9000 000 000 000 000 4f。
//502实例x-y-z
137=0x89 268=0x10C 136=0x88
//但是我在整个二进制文件中找不到00 00 00 89 00 00 01 0c 00 00 00 00 88,即使boost正确解析了这个实例
//503实例x-y-z
306=0x132 215=0xD7 64=0x40
//但是我在整个二进制文件中找不到00 00 01 32 00 00 00 00 d7 00 00 00 00 40,即使boost正确解析了这个实例
//504实例x-y-z
224=0xE0 154=0x9A 86=0x56
00 00 00 00 00 00 00 00 9a 00 00 00 00 56
//但是我不能在整个二进制文件中找到00 00 00 e0 00 00 00 9a 00 00 00 00 56,即使这个实例被boost正确解析
通过文本文件可以成功地对数据进行序列化和反序列化。由于这可能意味着我自定义类InstanceIdentity中序列化函数的正确性,因此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:我花了2天的时间来寻找问题的根源,在此期间,我多次检查了错误的if-else
条款,但忽略了这个错误。怎么会发生这种事?有人有什么好主意来防止这类错误吗?
- 为什么C中的通用链表中存储的数据已损坏
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 类数组正在损坏数据
- 带有zip_source_buffer的libzip会导致数据损坏和/或segfault
- 发送特定字节模式时串行端口数据损坏
- 放置在外部 DLL 中的类中的字符串数据的内存损坏
- Winapi ReadFile返回损坏的数据
- 向量元素数据损坏了Find()操作
- Boost 的数据驱动测试的联接运算符"+"损坏了第一列
- 为什么链表中的数据在嵌套函数中会更改/损坏?
- 写入文本文件的数据部分损坏且无法恢复
- C++和Python之间的数据损坏管道
- 内存中的数据损坏
- 如何在不存在任何数据损坏风险的情况下序列化对象
- 使用 IOCP 的 TCP/IP 服务器.接收缓冲区中偶尔的数据损坏
- 尝试读入内存时检查磁盘上文件的二进制数据损坏情况
- 文件结构,以避免数据损坏
- boost::async_write导致数据损坏
- 链接方法会导致数据损坏
- 通过复制捕获Lambda函数会导致数据损坏