C++ Boost二进制序列化不';我不偶尔工作。解析的数据有时会损坏
由于未知的原因,boost二进制序列化偶尔不起作用。解析的数据有时会损坏 最初,我手动序列化了自定义类的实例,每个实例都是文本文件中的一行。但是,速度很慢。(文本文件的处理速度为2 MB/秒,这可以在windows任务管理器中看到。)最近我改为使用boost二进制序列化。然而,奇怪的事情发生了 我存储了许多InstanceIdentity类的实例,其中包含一个字符串成员变量和一个表示x-y-z整数坐标的struc成员变量 我的问题是:前面的504个实例可以成功地从二进制文件中解析并打印到屏幕上。但是,第505个实例被错误地解析(x-y-z坐标不应超过512),然后下面的实例就会变得一团糟。很快boost就会抛出一个未知异常。我试图捕捉它,并使用.what()方法来显示更多信息。但是,它只显示C++ Boost二进制序列化不';我不偶尔工作。解析的数据有时会损坏,c++,serialization,boost,binary,C++,Serialization,Boost,Binary,由于未知的原因,boost二进制序列化偶尔不起作用。解析的数据有时会损坏 最初,我手动序列化了自定义类的实例,每个实例都是文本文件中的一行。但是,速度很慢。(文本文件的处理速度为2 MB/秒,这可以在windows任务管理器中看到。)最近我改为使用boost二进制序列化。然而,奇怪的事情发生了 我存储了许多InstanceIdentity类的实例,其中包含一个字符串成员变量和一个表示x-y-z整数坐标的struc成员变量 我的问题是:前面的504个实例可以成功地从二进制文件中解析并打印到屏幕上。
未知异常
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.
我试图解决它
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能够很好地处理它们)。