Boost を使用して、複数のオブジェクトをバイナリ アーカイブにシリアル化します。これらのオブジェクトを から読み戻す場合binary_iarchive
、アーカイブ内にいくつのオブジェクトがあるかを知る方法、または単にアーカイブの終わりを検出する方法はありますか?
私が見つけた唯一の方法は、try-catch を使用してストリーム例外を検出することです。前もって感謝します。
Boost を使用して、複数のオブジェクトをバイナリ アーカイブにシリアル化します。これらのオブジェクトを から読み戻す場合binary_iarchive
、アーカイブ内にいくつのオブジェクトがあるかを知る方法、または単にアーカイブの終わりを検出する方法はありますか?
私が見つけた唯一の方法は、try-catch を使用してストリーム例外を検出することです。前もって感謝します。
いくつかのアプローチを考えることができます:
アーカイブとの間で STL コンテナーをシリアル化します (ドキュメントを参照してください)。アーカイブは、コンテナー内にあるオブジェクトの数を自動的に追跡します。
オブジェクトをシリアル化する前に、カウント変数をシリアル化します。オブジェクトを読み戻す場合、読み戻すオブジェクトの数が事前にわかります。
最後のオブジェクトに、オブジェクトのリストの終わりを示す一種の標識として機能する特別な値を持たせることができます。isLast
おそらく、オブジェクトにメンバー関数を追加できます。
これはあまりきれいではありませんが、アーカイブ内のオブジェクトの数を格納する別の「インデックス ファイル」をアーカイブと一緒に持つことができます。
基になるストリーム オブジェクトの位置を使用してtellp
、ファイルの最後にいるかどうかを検出します。
例(テストされていない単なるスケッチ):
std::streampos archiveOffset = stream.tellg();
std::streampos streamEnd = stream.seekg(0, std::ios_base::end).tellg();
stream.seekg(archiveOffset);
while (stream.tellp() < streamEnd)
{
// Deserialize objects
}
これは、XML アーカイブでは機能しない可能性があります。
シリアル化を開始するときに、すべてのオブジェクトが揃っていますか? そうでない場合は、ブーストのシリアル化を「悪用」しています。そのように使用することは意図されていません。しかし、私はそれをそのように使用try catch
しており、ファイルの終わりを見つけるために使用しています。実装のどこかに隠してください。ただし、この方法で使用する場合は、ポインターをシリアル化しないか、ポインター追跡を無効にする必要があることに注意してください。
すべてのオブジェクトが既にある場合は、Emile の回答を参照してください。それらはすべて有効なアプローチです。
ファイルから1バイトを読み取るだけです。
終わりに達しない場合は、
その後、1バイトをバックワードします。