read()
andのオーバーヘッドについてはあまり気にしません。write()
バッファリングされたストリームと、データ ストリーム内をスキップせずに読み書きできるデータ形式を使用するだけです。
書き出すシリアル化されたストリームは、データ表現に十分近い必要があるため、単純なコピーで大量のデータを引き継ぐことができますが、古いバージョンのデータ形式から再構築したり、内部表現が異なるマシン上で再構築したりできるほど抽象的である必要があります。 .
私は通常、マジック ナンバー、データ形式のバージョン、およびマシン固有の部分をキャプチャする一連の値を含むヘッダーを定義します。あなたの場合、それは
struct header {
char magic[4];
uint32_t endianness; // 0x01020304
uint32_t version; // incremented when format changes
// paranoia
uint8_t char_bit; // std::numeric_limits<char>::digits
// sizeofs for all types format is dependent on
uint8_t sizeof_int; // sizeof(int)
};
データを読み戻すときは、ヘッダーの値を予想と比較します。これが一致しない場合は、これを処理する逆シリアル化コードを追加できます。
行については、次のようなエンコーディングを使用します
uint16 string_length;
char string_data[]; // string_length bytes, padding if odd
uint16 vector_length;
int vector_data[]; // vector_length ints
これにより、効率的に保存および復元できます。要件が変更された場合は、バージョン番号を増やし、新しい形式を定義し、パーサー コードを適応させて新しいメモリ内表現を作成します。