2

動的に割り当てられた配列を含む単純なクラスがあり、バイナリ ファイルに格納できるようにシリアル化する必要があります。配列のため、 sizeof(MyClass) を使用して単純にバッファを割り当てることはできません。

クラスは次のようになります。

class ReplayFrame
{
public:
    // ...

private:
    int dataType_;
    int timeStamp_;
    int frameNumber_;
    size_t dataSize_;
    char* data_;
};

そして、これが私が思いついた解決策です:

std::ostream& operator<< (std::ostream& out, const ReplayFrame& frame)
{
    out.write((char *) &frame.dataType_, sizeof(int));
    out.write((char *) &frame.timeStamp_, sizeof(int));
    out.write((char *) &frame.frameNumber_, sizeof(int));
    out.write((char *) &frame.dataSize_, sizeof(size_t));
    out.write(frame.data_, frame.dataSize_);

    return out;
}

これは問題ないように思えますが、 << 演算子の意味が若干変わります。std::ostream& ReplayFrame::serialize(std::ostream& out, const ReplayFrame& frame)では、代わりに次のようなものが良いでしょうか?

または、serialize()ストリームを使用せず、代わりにサイズとシリアル化されたオブジェクトへのポインターを返すメソッドが必要な場合があります。次のように、次のように自分で記述します。

ReplayFrame replayFrame;
int size;

char *frameSerialized = replayFrame.serialize(size);
fileStream.write(frameSerialized, size);

delete frameSerialized; // or frameSerialized.release() ?

ご覧のとおり、私はかなり混乱しているので、良い提案をお待ちしています。(注: 私は Qt を使用しており、boost も c++11 もありません)。

4

1 に答える 1

1

最初に重要なこと: ファイル、別のプロセス、または悪い考えであるかに関係なく、バイナリ データをどこにでもダンプするだけです。フォーマットはバイナリにすることができ、現在開発中のシステムの内部表現の側面と一致する場合がありますが、常にデータをフォーマットする必要がありますただし、わずかに成功したプログラムは、異なるコンパイラ世代、おそらくプロセッサのアップグレード後も存続し、別のプラットフォームに移植されることを認識する必要があります。バイナリ形式が現在コンパイラがたまたまデータを表現する方法に依存している場合、これらすべてが頭痛の種になります。プログラムが成功した場合、それはさらに大きな頭痛の種になるでしょう。

注意を払いたいバイナリ形式の側面は次のとおりです。

  • 個々の単語のサイズ
  • ワード内のバイト順
  • 単語間の潜在的なパディング
  • 書き込まれたデータ項目の順序

たとえば、sizeof()ダンプまたは読み取りのバイト数を決定するために使用するだけでは、32 ビット プラットフォームと 64 ビット プラットフォームの間では機能しません。たとえば、PowerPC と x86 システムの間では、単にバイトを順番にダンプするだけではうまくいきません。バイトをダンプするだけでも今は簡単かもしれませんが、中期的にはさらに多くの問題が発生するでしょう。

この演算子でテキスト形式のストリーム クラスを使用しない限り、出力演算子のオーバーロードは問題ありません。std::streambufたとえば、ファイルの読み取りや書き込みなど、バイトの読み取りと書き込みに関係するレイヤーを使用できますstd::filebufが、バイナリ形式のストリームの場合は、オーバーロード時にバイナリストリームの専用システムが必要ですoperator<<()。もちろん、これはクラスがこのシリアライゼーション システムで機能するために対応する操作をオーバーロードする必要があることを意味しますが、テキストとバイナリ形式のアイデアを混在させると、多くの悲しみが生じることはほぼ確実です。

于 2012-11-18T22:20:59.460 に答える