ファイルには常にバイナリのシリアル化があります。セクシーではありませんが、機能し、サードパーティのツールやソフトウェアは必要ありません。 の前に必ずのデータグループとバージョン番号(通常はスキーマ番号と呼ばれます)を付けてください。これは、データモデルを変更したときの頭痛を緩和します。
OOPの設定では、通常、永続化が必要なすべてのオブジェクトに、方向パラメータ(保存と読み込み)とバイナリファイルを表すオブジェクトを受け取るSerialize()メソッドがあります。書き出すときは、すべてのオブジェクトがシリアル化されるようにする必要があります。あなたが読んでいるときに行くようにオブジェクトを作成する必要があります。オブジェクトを直列化する方法を知っているコンテナによって、このプロセスはしばしば簡単になります。
変換は、さまざまなSerialize()メソッドによってオンザフライで処理されます。たとえば、現在スキーマバージョン5にあるオブジェクトが、スキーマバージョン4を使用して記述されたデータに遭遇すると、それを処理する方法がわかります。
しかし、SQLのようなクエリ機能が必要な場合は、これが最善の選択肢ではないかもしれません。これは、すべてのデータを読み込むときに最適です。
例:
はあなたがシリアライズしたい2つのメンバ変数を持つクラスFooのを言う:
class Foo
{
public:
const unsigned int SCHEMA = 1;
int i;
double d;
void Serialize(bool bSaving, CBinaryFile file)
{
if (bSaving)
{
// Serialize everything out
file << SCHEMA << i << d;
}
else
{
// Read in the schema number first
unsigned int nSchema;
file >> nSchema;
// Validate the schema number
if (nSchema > SCHEMA)
{
// We're reading in data that was written with a newer version of the program
// Since we don't know how to handle that let's error out
throw exception;
}
// Read everything in
file >> i >> d;
}
}
}
さて、あなたはFooのに他のメンバーを追加する年にしましょう。
class Foo
{
public:
const unsigned int SCHEMA = 2;
int i;
double d;
string s;
void Serialize(bool bSaving, CBinaryFile file)
{
if (bSaving)
{
// Serialize everything out
file << SCHEMA << i << d << s;
}
else
{
// Read in the schema number first
unsigned int nSchema;
file >> nSchema;
// Validate the schema number
if (nSchema > SCHEMA)
{
// We're reading in data that was written with a newer version of the program
// Since we don't know how to handle that let's error out
throw exception;
}
// Read everything in
file >> i >> d;
if (nSchema > 1)
file >> s;
}
}
}
フライ変換でスキーマ番号をすべてラップする限り、変換は簡単です。
ええと、コンバージョンやカスタムシリアル化の処理方法に関するガイドはありますか?私が最後にバイナリのシリアル化を試みたとき、コードを変更した後に古いシリアル化されたデータを開くことができなくなってしまいました。 – Davy8
私は助けてくれることを望む例を加えました。 – onedozenbagels