ファイル内のミニファイルシステムのような、より高いレベルでデータを保存するために使用するサブ構造を定義することを検討します。
たとえば、ファイル形式がアプリケーション固有のデータを保存する場合でも、アプリケーションに依存しないコードがファイルのレイアウトを理解できるように、ファイル内にレコード/ストリームなどを定義することを検討しますが、もちろん、不透明なペイロードを理解してください。
もう少し具体的に見てみましょう。メモリにデータを格納する通常の方法を検討してください。一般に、それらは、連続した展開可能な配列/リスト、ポインター/参照ベースのグラフ、および特定の形式のデータのバイナリ BLOB に要約できます。
したがって、同様の方針に沿ってバイナリ ファイル形式を定義すると有益な場合があります。配列 (同じ型のレコードのリスト)、参照 (ファイル内の他のレコードへのオフセット)、またはデータ BLOB (文字列データなど) の形式であるかどうかにかかわらず、次のデータの長さと構成を示すレコード ヘッダーを使用します。特定のエンコーディングで、しかし参照を含まない)。
慎重に設計されていれば、ファイル形式を一度にデータを永続化するためだけでなく、必要に応じて段階的に使用することもできます。サブ構造が適切に設計されている場合、アプリケーションにとらわれず、たとえば、ブロブ、配列、参照レコードの種類を理解し、ファイルをトレースして未使用のレコード (つまり、レコード) を削除できるガベージ コレクション アプリケーションを作成できます。指されなくなったもの)。
それはただのアイデアです。アイデアを探す他の場所は、一般的なファイル システム設計、またはリレーショナル データベースの物理ストレージ戦略です。
もちろん、要件によっては、これはやり過ぎかもしれません。メモリ内データを永続化するためのバイナリ形式を単に求めているだけかもしれません。その場合、考慮すべきアプローチはタグ付けされたレコードです。
このアプローチでは、すべてのデータにタグのプレフィックスが付けられます。タグは、直後のデータのタイプと、場合によってはその長さと名前を示します。リストには、ペイロードのない「end-list」タグをサフィックスとして付けることができます。タグには識別子が埋め込まれている可能性があるため、理解されていないタグは、シリアル化メカニズムが内容を読み取るときに無視できます。この点では、代わりにバイナリ イディオムを使用することを除いて、XML に少し似ています。
実際、XML は、ファイル形式の長期的な寿命を探すのに適した場所です。その名前空間機能を見てください。読み取りと書き込みのコードを慎重に作成すれば、タグ付けされた (再帰的に) データが理解できない場所と内容を保持するアプリケーションを作成できるはずです。