Boost 二进制序列化偶尔不起作用。解析的数据有时会损坏
Boost binary serialization doesn't work occasionally. The parsed data is corrupted sometimes
由于未知原因,boost 二进制序列化偶尔不起作用。解析的数据有时会损坏。
最初我手动序列化自定义 class 的实例,每个实例都是文本文件中的一行。但是速度很慢。(处理文本文件的速度是2MB/sec,可以在windows任务管理器中看到。)最近改用boost二进制序列化。然而,奇怪的事情发生了。
我存储了很多classInstanceIdentity的实例,其中包含一个string成员变量和一个代表x-y-z整数坐标的struc成员变量。
我的问题:之前的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::in | ios_base::binary);
但问题依旧。
- 我尝试使用 boost 序列化文本文件中的相同数据。 (只需要更改文件打开模式和boost存档类型。)
数据可以通过文本文件成功序列化和反序列化。由于这可能意味着我自定义的 class 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:我花了2天的时间来寻找问题的根源,期间我检查了很多次错误的if-else
子句,但都忽略了错误。怎么会发生这种事?有没有人有一些好的想法来防止这种类型的错误?
由于未知原因,boost 二进制序列化偶尔不起作用。解析的数据有时会损坏。
最初我手动序列化自定义 class 的实例,每个实例都是文本文件中的一行。但是速度很慢。(处理文本文件的速度是2MB/sec,可以在windows任务管理器中看到。)最近改用boost二进制序列化。然而,奇怪的事情发生了。
我存储了很多classInstanceIdentity的实例,其中包含一个string成员变量和一个代表x-y-z整数坐标的struc成员变量。
我的问题:之前的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::in | ios_base::binary);
但问题依旧。
- 我尝试使用 boost 序列化文本文件中的相同数据。 (只需要更改文件打开模式和boost存档类型。)
数据可以通过文本文件成功序列化和反序列化。由于这可能意味着我自定义的 class 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:我花了2天的时间来寻找问题的根源,期间我检查了很多次错误的if-else
子句,但都忽略了错误。怎么会发生这种事?有没有人有一些好的想法来防止这种类型的错误?