ブーストバイナリシリアル化は時々機能しません。解析されたデータが破損することがあります

ジョンスミス

理由は不明ですが、ブーストバイナリシリアル化が機能しない場合があります。解析されたデータが破損することがあります。

もともと私は自己定義クラスのインスタンスを手動でシリアル化し、各インスタンスはテキストファイルの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.

それを解決するための私の試み。

  1. このページ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);

しかし、問題は続いています。

  1. ブーストを使用して、テキストファイル内の同じデータをシリアル化しようとしました。(変更する必要があるのは、ファイルオープンモードとブーストアーカイブタイプのみです。)

データは、テキストファイルを介して正常にシリアル化および逆シリアル化できます。これはおそらく、自己定義クラスInstanceIdentityのシリアル化関数の正確さを意味するため、ブーストバイナリシリアル化の問題はさらに奇妙になります。

  1. ブーストバイナリファイルを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]

編集
0

コメントを追加

0

関連記事

分類Dev

解析はアプリリリースバージョンでは機能しませんが、シミュレーターで、またはxcodeを介してデバイスにインストールされた場合に機能します

分類Dev

ITextSharpはUnityエディターで完全に機能しますが、アプリをWindowsスタンドアロンにビルドすると、破損した0バイトのファイルが生成されます

分類Dev

データベース ''を開くことができません。アプリケーションが認識しているデータベースではないか、ファイルが破損している可能性があります

分類Dev

「シリアル化されたハッシュにターミネーターがありません」エラーで破損したsvnリポジトリ

分類Dev

F#コアライブラリのソースコードには、タプルを構造体としてコンパイルするためのフラグがありますが、機能させることができません

分類Dev

中断されたラップトップのバッテリーがなくなると、データが破損するリスクがありますか?

分類Dev

バイナリを実行すると「そのようなファイルまたはディレクトリはありません」エラーが表示され、アクセス許可も拒否されました

分類Dev

postgisがインストールされていますが、拡張機能を作成できません:エラー:拡張機能制御ファイルを開くことができませんでした〜/ postgis.control ":そのようなファイルまたはディレクトリはありません

分類Dev

IOSでのFacebookログインはエミュレーターで機能しますが、ネイティブアプリがインストールされているデバイスでは機能しません

分類Dev

Xamarin Android:アーカイブ-「アプリがインストールされていません。パッケージが破損しているようです」

分類Dev

S3でインポートされた画像が破損することがあります:Chromeでレンダリングされますが、Firefoxではレンダリングされません

分類Dev

Boostシリアル化はメインでのみ機能しますか?他のオブジェクトで使用するときは、「 'serialize'という名前のメンバーがありません」と言い続けます

分類Dev

Serviceworkerがアクティブ化されたりメッセージを受信したりすることはありませんが、ワークボックス機能はサブパスで機能します

分類Dev

デュアルブートUbuntuは、「TOCBLOCKが見つかりません。データベースが破損している可能性があります」というエラーで起動しません。

分類Dev

Windows XPデュアルブート(wubiインストール)がubuntuで機能しなくなりました-「system32 \ hal.dllが見つからないか破損しています」というエラーが表示されます

分類Dev

Windows XPデュアルブート(wubiインストール)がubuntuで機能しなくなりました-「system32 \ hal.dllが見つからないか破損しています」というエラーが表示されます

分類Dev

イオンプロキシを設定しているときは、イオンサーブでは機能しますが、デバイスで実行されているビルドアプリは機能しません

分類Dev

podman を --init で実行すると、次のエラーが表示されます: エラー: ホスト上でコンテナーの初期化バイナリが見つかりません: stat /usr/libexec/podman/catatonit: そのようなファイルまたはディレクトリはありません

分類Dev

バイナリを別のディレクトリにインストールした後、「そのようなファイルまたはディレクトリはありません」というエラーが表示されます

分類Dev

phpBB3SQLデータベーステーブルが存在しませんエラー; バックアップからインポートしたり、壊れたデータベースを削除したりすることはできません

分類Dev

Zshエイリアスは機能しませんが、ターミナルに貼り付けるとコマンドは機能します

分類Dev

wubiを使用したデュアルブート時のGRUBメニュー「最初にカーネルをリードする必要がある」これまでのところ何も機能していません

分類Dev

Chrome拡張機能が削除された場合、レジストリから再度インストールされることはありません

分類Dev

PHP-バイナリボディデータを使用したPOSTリクエスト-CURLでは機能しますが、Laravelでは機能しません

分類Dev

チャネルの作成時に「このポリシーでは、「ライター」サブポリシーの1つが満たされている必要があります:アクセス許可が拒否されました」というエラーが発生しました

分類Dev

バックグラウンドのアプリケーションまたはデバイスがロックされている間、didEnterRegion()/ didExitRegion()が起動することはありませんでした

分類Dev

C ++ブーストポインタのシリアル化を機能させることができません

分類Dev

C ++ブーストポインタのシリアル化を機能させることができません

分類Dev

モデルデータをシリアル化すると、TypeErrorが発生します「ListSerializerタイプのオブジェクトはJSONシリアル化可能ではありません」

Related 関連記事

  1. 1

    解析はアプリリリースバージョンでは機能しませんが、シミュレーターで、またはxcodeを介してデバイスにインストールされた場合に機能します

  2. 2

    ITextSharpはUnityエディターで完全に機能しますが、アプリをWindowsスタンドアロンにビルドすると、破損した0バイトのファイルが生成されます

  3. 3

    データベース ''を開くことができません。アプリケーションが認識しているデータベースではないか、ファイルが破損している可能性があります

  4. 4

    「シリアル化されたハッシュにターミネーターがありません」エラーで破損したsvnリポジトリ

  5. 5

    F#コアライブラリのソースコードには、タプルを構造体としてコンパイルするためのフラグがありますが、機能させることができません

  6. 6

    中断されたラップトップのバッテリーがなくなると、データが破損するリスクがありますか?

  7. 7

    バイナリを実行すると「そのようなファイルまたはディレクトリはありません」エラーが表示され、アクセス許可も拒否されました

  8. 8

    postgisがインストールされていますが、拡張機能を作成できません:エラー:拡張機能制御ファイルを開くことができませんでした〜/ postgis.control ":そのようなファイルまたはディレクトリはありません

  9. 9

    IOSでのFacebookログインはエミュレーターで機能しますが、ネイティブアプリがインストールされているデバイスでは機能しません

  10. 10

    Xamarin Android:アーカイブ-「アプリがインストールされていません。パッケージが破損しているようです」

  11. 11

    S3でインポートされた画像が破損することがあります:Chromeでレンダリングされますが、Firefoxではレンダリングされません

  12. 12

    Boostシリアル化はメインでのみ機能しますか?他のオブジェクトで使用するときは、「 'serialize'という名前のメンバーがありません」と言い続けます

  13. 13

    Serviceworkerがアクティブ化されたりメッセージを受信したりすることはありませんが、ワークボックス機能はサブパスで機能します

  14. 14

    デュアルブートUbuntuは、「TOCBLOCKが見つかりません。データベースが破損している可能性があります」というエラーで起動しません。

  15. 15

    Windows XPデュアルブート(wubiインストール)がubuntuで機能しなくなりました-「system32 \ hal.dllが見つからないか破損しています」というエラーが表示されます

  16. 16

    Windows XPデュアルブート(wubiインストール)がubuntuで機能しなくなりました-「system32 \ hal.dllが見つからないか破損しています」というエラーが表示されます

  17. 17

    イオンプロキシを設定しているときは、イオンサーブでは機能しますが、デバイスで実行されているビルドアプリは機能しません

  18. 18

    podman を --init で実行すると、次のエラーが表示されます: エラー: ホスト上でコンテナーの初期化バイナリが見つかりません: stat /usr/libexec/podman/catatonit: そのようなファイルまたはディレクトリはありません

  19. 19

    バイナリを別のディレクトリにインストールした後、「そのようなファイルまたはディレクトリはありません」というエラーが表示されます

  20. 20

    phpBB3SQLデータベーステーブルが存在しませんエラー; バックアップからインポートしたり、壊れたデータベースを削除したりすることはできません

  21. 21

    Zshエイリアスは機能しませんが、ターミナルに貼り付けるとコマンドは機能します

  22. 22

    wubiを使用したデュアルブート時のGRUBメニュー「最初にカーネルをリードする必要がある」これまでのところ何も機能していません

  23. 23

    Chrome拡張機能が削除された場合、レジストリから再度インストールされることはありません

  24. 24

    PHP-バイナリボディデータを使用したPOSTリクエスト-CURLでは機能しますが、Laravelでは機能しません

  25. 25

    チャネルの作成時に「このポリシーでは、「ライター」サブポリシーの1つが満たされている必要があります:アクセス許可が拒否されました」というエラーが発生しました

  26. 26

    バックグラウンドのアプリケーションまたはデバイスがロックされている間、didEnterRegion()/ didExitRegion()が起動することはありませんでした

  27. 27

    C ++ブーストポインタのシリアル化を機能させることができません

  28. 28

    C ++ブーストポインタのシリアル化を機能させることができません

  29. 29

    モデルデータをシリアル化すると、TypeErrorが発生します「ListSerializerタイプのオブジェクトはJSONシリアル化可能ではありません」

ホットタグ

アーカイブ