理由は不明ですが、ブーストバイナリシリアル化が機能しない場合があります。解析されたデータが破損することがあります。
もともと私は自己定義クラスのインスタンスを手動でシリアル化し、各インスタンスはテキストファイルの1行でした。ただし、速度は遅かった(テキストファイルは2 MB /秒の速度で処理され、Windowsタスクマネージャーで確認できます)。最近、ブーストバイナリシリアル化を使用するように変更しました。しかし、奇妙なことが起こります。
文字列メンバー変数とxyz整数座標を表すstrucメンバー変数を含むクラスInstanceIdentityの多くのインスタンスを格納しました。
私の問題:以前の504インスタンスは、バイナリファイルから正常に解析され、画面に出力されます。ただし、505番目のインスタンスは誤って解析されます(xyz座標は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.
それを解決するための私の試み。
このページ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);
しかし、問題は続いています。
データは、テキストファイルを介して正常にシリアル化および逆シリアル化できます。これはおそらく、自己定義クラスInstanceIdentityのシリアル化関数の正確さを意味するため、ブーストバイナリシリアル化の問題はさらに奇妙になります。
ブーストバイナリファイルを16進エディター(notepad ++プラグイン)で開き、505番目のインスタンスで何かを見つけようとしました。504番目のインスタンスのxyz座標の16進数は次のとおりです。
//最初のインスタンスxyz
169 = 0xA9 144 = 0x90 79 = 0x4F
//そして私は適切な場所で0000 00 a9 00 00 00 90 00 00 004fを見つけることができます。
// 502番目のインスタンスxyz
137 = 0x89 268 = 0x10C 136 = 0x88
//しかし、このインスタンスがブーストによって正しく解析されたとしても、バイナリファイル全体で00 00 00 89 00 00 01 0c 00 00 0088が見つかりません。
// 503番目のインスタンスxyz
306 = 0x132 215 = 0xD7 64 = 0x40
//しかし、このインスタンスがブーストによって正しく解析されたとしても、バイナリファイル全体で00 00 01 32 00 00 00 d7 00 00 0040が見つかりません。
// 504番目のインスタンスxyz
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 0056が見つかりません。
質問:ブーストバイナリファイル内で何が起こっているのか誰か知っていますか?インスタンスをバイナリファイルにシリアル化し、そこから逆シリアル化するにはどうすればよいですか?私は同じコンピューターを使用しているので、この問題は移植性に関するものではないと思います。
環境:Windows 8 64ビット、Visual Studio 2013、ブースト1_59_0バージョン。
この質問を投稿して大変申し訳ありません。ブーストバイナリシリアル化は期待どおりに機能します。ちょっとしたミスをしましたが、数分前まで見つかりませんでした。
私はおそらく世界で最も愚かなプログラマーです。私の関数では、boolパラメーターを使用identity_file_in_binary
して、ユーザーがバイナリファイルを優先するかどうかを選択できるようにします。次に、if-else
句を使用.open()
して別のモードで実行します。スコープ内で使用iso_base::binary
する必要がありましたif
が、誤ってスコープ内に入れてしまいましたelse
。この間違いを修正した後、私のプログラムはスムーズに機能しました。
PS:私は問題の原因を見つけるのに2日間を費やしました。その間、私はif-else
何度も誤った条項をチェックしましたが、間違いを見落としていました。どうしてこのことが起こるのでしょうか?この種の間違いを防ぐための良いアイデアはありますか?
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加