Для организации вменяемой системы сериализации предлагаю посмотреть в сторону boost.
Или можно свести все, например, к такому
Объявление типа
C++ (Qt)
struct SimpleStruct
{
int m_int;
double m_double1;
double m_double2; // например, добавлен при доработке позднее
};
Отдельное описание сериализации/десериализации
C++ (Qt)
// перечень версий сериализации (если их требуется вести)
// по умолчанию используется последняя
SERIALIZE_VERSIONS_BEGIN( SimpleStruct )
SERIALIZE_VERSION( Version_1 )
SERIALIZE_VERSION( Version_2 )
SERIALIZE_VERSIONS_END
// метод десериализации MyStruct для версии Version_1
// обеспечивает бинарную совместимость с более ранней реализацией
SERIALIZE_LOAD_BEGIN( SimpleStruct, Version_1 )
{
archive
.serialize( value.m_int )
.serialize( value.m_double1 );
}
SERIALIZE_END
// метод сериализации/десериализации MyStruct для версии Version_2
// текущий актуальный метод сериализации/десериализации
SERIALIZE_BEGIN( SimpleStruct, Version_2 )
{
archive
.serialize( value.m_int )
.serialize( value.m_double1 )
.serialize( value.m_double2 );
}
SERIALIZE_END
Метод сериализации/десериализации единый SERIALIZE_BEGIN .. SERIALIZE_END, но если требуется учесть специфику, то можно использовать взамен пару SERIALIZE_LOAD_BEGIN .. SERIALIZE_END и SERIALIZE_SAVE_BEGIN .. SERIALIZE_END.
А использовать можно так
C++ (Qt)
// Примеры сериализации данных без использования версий
template < typename _Data >
void serializeData ( _Data & data )
{
typedef _Data Data;
// пример десериализации из std::cin
// и сериализации в std::cout
{
typedef ::Serialize::Basic::OStreamArchive< std::ostream > StdOutArchive;
typedef ::Serialize::Basic::IStreamArchive< std::istream > StdInArchive;
Data in_data;
StdInArchive( std::cin )
>> in_data;
StdOutArchive( std::cout )
<< in_data;
}
// пример сериализации в QDebug
{
typedef ::Serialize::Basic::OStreamArchive< QDebug > QDebugArchive;
QDebug stream = qDebug();
QDebugArchive archive( stream );
archive
<< data;
}
// и сериализации в файл с помощью QDataStream
{
typedef ::Serialize::Basic::OStreamArchive< QDataStream > QDataOutArchive;
typedef ::Serialize::Basic::IStreamArchive< QDataStream > QDataInArchive;
QFile file( "test.bin" );
file.open( QFile::WriteOnly );
QDataStream out_stream( &file );
QDataOutArchive out_archive( out_stream );
out_archive
<< data;
file.close();
file.open( QFile::ReadOnly );
QDataStream in_stream( &file );
QDataInArchive in_archive( in_stream );
_Data in_data;
in_archive
>> in_data;
file.close();
}
}
int main ( int, char ** )
{
SimpleStruct my_struct;
serializeData( my_struct );
return 0;
}
Реализация пока что проприентарная, полный код выложить не могу, только идеи).