私は、直列化オブジェクトのグラフを含むファイルにバイナリデータフォーマットを書いています。エラーに対してより弾力性があり、問題をデバッグできるようにするために、ストリーム内の各オブジェクトに長さ接頭辞を付けることを検討しています。私は現在、C#とBinaryWriterを使用していますが、それはかなり一般的な問題です。長さのプレフィックス付きバイナリデータを効率的に書く方法
それは多くの戦略がある長さのプレフィックスを書き込むよう することができるように、完全にシリアライズされるまで、各オブジェクトの大きさが不明である。
十分で書き込みバッファを使用するとスペースを使用してランダムアクセスを行い、オブジェクトがシリアル化された後で長さを正しい位置に挿入します。
各オブジェクトを独自のMemoryStreamに書き込んだ後、バッファの長さとバッファの内容をメインストリームに書き込みます。
最初のパスですべてのオブジェクトの長さをゼロに書き、ファイル内のすべてのオブジェクトサイズ(サイズを設定するオブジェクトのテーブル)の位置を覚えて、すべてのサイズで2番目のパスを埋めます。
??
合計サイズ(及び第一/最外オブジェクトのこのようサイズ)は1メガバイトの周りに典型的であるが、50〜100メガバイトと大きくすることができます。私の懸念事項は、プロセスのパフォーマンスとメモリ使用量です。
どの戦略が最も効率的でしょうか?
シリアル化する前にサイズを計算するのを止めるのはなぜですか?あなたのバイナリシリアル化のどの部分が非決定的ですか? – Jodrell
これは非決定的ではありませんが、シリアライゼーションコード自体はサイズの仕様とほぼ同じです。例えば、シリアライゼーションは、ファイルフォーマットのバージョン(以前のフォーマットとして保存する場合)などに応じて、シリアライズ/デシリアライズメソッドによって異なるパスをとることがあります。それが決定論的であっても、本当に難しいでしょう。 –