0

クラスのオブジェクトへのポインタを含むマップがあり、それらをすべてバイナリファイルに出力してから、読み戻そうとしています。構文が正しいとは確信していません。なぜなら、それらを読み返すと、壊れている、つまり、ファイルに入る前に与えられたデータがないように見えるからです。この前の行は、データを反復処理してすべて出力するので、印刷する前に問題がないことがわかります。

これは、アカウントをバイナリファイルに出力するコードです。

for (it = accounts.begin(); it != accounts.end(); it++)
{
    outFile.write((char*)&(*it).second, sizeof(Account));
}

これで大丈夫かどうか誰か知っていますか?

編集:そしてそれはそうではありませんでした

for (it = accounts.begin(); it != accounts.end(); it++)
{
    outFile.write((char*)&(*(it->second)), sizeof(Account));
}
4

3 に答える 3

1

これは、いくつかの理由でオブジェクトをシリアル化する方法ではありません。

  • オブジェクトがポリモーフィックである場合、ほとんどの(すべての?)実装はオブジェクト内の仮想テーブルへのポインターを持っているので、それを書きますが、それを読み戻すと、それはもはや有効ではありません。
  • メンバーへの他のポインタが書き込まれますが、それらを読み返すときに意味がありません。

シリアル化は、オブジェクトのバイトをファイルに書き込むほど簡単ではありません。

簡単な解決策は、既存のライブラリを使用することです-グーグルプロトコルバッファが思い浮かびます。

もう1つは自分で実装することですが、特に複数のプラットフォーム/オペレーティングシステムでサポートが必要な場合は困難です。

于 2012-10-26T11:04:07.470 に答える
0

あなたは記憶のアドレスを見るでしょう、そしてそれ以上はありません。より複雑なメソッドを作成する必要があります。いくつかの考えについては、 Googleのprotobufエンコーディングを参照してください。

于 2012-10-26T11:04:15.350 に答える
0

char*ファイルにキャストされたメモリアドレスを書き込もうとしているようです。これらの数値は、まったく関連性がありません。おそらく、それらのポインタが指すオブジェクトをシリアル化する必要があります。したがって、最初にそのタイプのオブジェクトをシリアル化および逆シリアル化する手段を見つける必要があります。次に、マップに保持されているポインターを再参照して、それらをファイルに書き込みます。

于 2012-10-26T11:05:01.090 に答える