私が読んだり操作したりしたいくつかのファイル形式は、まさにそれを行います-メモリ標準またはレイアウトを定義し、通常、C に似た擬似的なデモでそれをバックアップしstruct
ます。構造体やクラスの表現を提供するものもあれば、ライブラリによって完全に抽象化されたものもあります。もちろん、これらのフォーマットは、すべてのフィールド、それらのサイズ、データのエンディアンなどを文書化します。
エンディアン関連の問題、パディング、複雑さ (たとえば、データ構造のバリエーションによって導入される)、および適切なバージョン管理が、エラーの最大の原因であると考えています。私が見つけたもう1つの問題は、過去のデータ構造の使用と、同様の機能を表すために使用されるデータ構造の不一致です.仕様を受け取って、いくつかの異なる文字列表現が含まれていることに気付くかもしれません.これらすべてを (双方向で) サポートし続けます。
そのルートを進める:
サポートしたくない場合は、バイナリ表現 (またはコンパイル可能なプログラム) にコミットするべきではありません (また、プラットフォームやツールセットが変更されるため、長期的な形式の試みは途中で失敗/つまずきます)。最初に正式なメモリ標準にコミットし、その上にテストと入力ファイルの例を作成して、表現が正しくシリアル化および逆シリアル化されていることを確認します。非常に基本的なテスト スイートは、モデルが必要なすべてのシステムで移植可能であることを確認するのに役立ち、潜在的な落とし穴や、気付いていないプラットフォーム固有の考慮事項を指摘することができます。
コンパイル可能な表現を本当に提供したい場合は、非常に準拠したstruct
表現に固執します。クライアントはその (メモリ内の) 表現を取得して、好きな C++ 抽象化/表現に変換できます。つまり、シリアル化された表現は、自明な単純な表現とそのような表現の中間ストレージ (フラット化およびパックされた構造体) を除いて、おそらくメモリ内の表現を反映するべきではありません。
重要な部分の 1 つは、これらの構造体を使用して作成したメモリ内オブジェクト グラフが、順方向および逆方向のシリアル化および逆シリアル化が可能であり、適切なバージョン管理をサポートしていることを確認するテストを用意する必要があることです。複雑なシリアル化された表現と互換性があります。つまり、このアプローチは、1 つの抽象化レイヤーを別のレイヤーの上に導入するだけであることがわかります。この点に関して、C++ 抽象化に、パックされたメモリ表現からそれ自体を作成する機能を与え、その表現がデータを失うことなくパックされた構造に正しく移入できることを保証することが必要な場合があります。
それを超えて、より高度なインターフェースを持つ必要はありますか? ある場合は、その情報を提供することをお勧めします。
そうです、メモリ標準は、プラットフォーム/アーキテクチャの違いに関係なく、正しく安定している必要があり、すべての実装が参照してテストする必要がある部分です。IOW、あなたは正しい軌道に乗っています ;)