バイナリ データ ファイルを作成する必要があります。1 回のパスで作成することはできません。一部のデータをシリアル化してから、戻ってヘッダーにオフセットを書き込む必要があります。ファイルはメモリ (数メガバイト) に問題なく収まります。を使用BinaryWriter
してオフセットを書き戻すことはできますwriter.Seek(x, SeekOrigin.Begin)
か? それとも、ファイルへの書き込み (およびそれを変更すること) に利点がありますか? それとも、本当の違いはありませんか?
2 に答える
ファイルにオフセットするのではなく、ヘッダーを表すパック構造を作成する必要があります。構造を入力し、ファイルの先頭に書き込みます。また、構造を一発で読みやすくなります。
私はあなたの問題を理解していると思います。プログラムの他の部分からオブジェクトをシリアル化していますが、シリアル化を要求するまで各チャンクの大きさはわかりません..そして、それらすべてを一度にシリアル化したくありません。多くのメモリ。
したがって、ファイルの先頭にある程度のスペースを残し、各チャンクの大きさを記録しながらバイナリ データをチャンクに書き込み、戻ってヘッダーを書き込んで、各チャンクの開始位置と終了位置を示します。
あなたが求めている解決策は合理的だと思われますが、ヘッダーの場所に戻ると BinaryWriter が上書きすると思うので、ヘッダーを書き込む余地を残すために空のバイトのパッドを前もって書き込む必要があります - http:/ /msdn.microsoft.com/en-us/library/system.io.binarywriter.seek.aspx#Y640
問題は、ヘッダーがどれくらい大きくなるかということです。空のバイトは何バイト書き込みますか? おそらく、シリアル化する必要があるオブジェクトの数に依存します。以前と同じ問題を抱えているようですね。
代わりに、例として、データを順番にパックします。
| --------- Chunk 1 ----------|--------- Chunk 2 -----------|
| length | name | ... | bytes | length | name | ... | bytes |
length パラメーターは、そのチャンクの合計の長さをエンコードします。次に、チャンクごとに持っているプロパティを取得し、シリアル化される実際のオブジェクトの raw バイトが何であれ、エンコードします。