Всегда существует двоичная сериализация в файл. Это не сексуально, но работает, и не требует никаких сторонних инструментов или программного обеспечения. Просто убедитесь, что перед каждой группировкой данных стоит номер версии (обычно называемый номером схемы). Это уменьшит головные боли в будущем, когда вы измените модель данных.
В настройках ООП обычно каждый объект, который необходимо сохранить, имеет метод Serialize (), который принимает параметр направления (сохранение или загрузка), и объект, представляющий двоичный файл. При записи нужно просто убедиться, что каждый объект сериализуется. При чтении нужно создавать объекты по ходу дела. Этот процесс часто упрощается контейнером, который знает, как сериализовать и выводить объект.
Преобразование выполняется на лету различными методами Serialize (). Например, если объект, который в настоящее время находится в Схеме версии 5, встречает данные, которые были записаны с использованием Схемы версии 4, он будет знать, как с этим обращаться.
Однако, если вам нужен SQL-запрос, это может быть не лучшим вариантом. Это работает лучше всего, когда вы собираетесь читать все данные.
Пример:
Скажем, у вас есть класс Foo, который имеет 2 переменные-члены, которые вы хотите сериализовать:
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;
}
}
}
Пока вы упаковываете все в числа в схемах, преобразование на лету происходит просто.