Posts tagged ‘boost’

boost::serialization - бинарная сериализация

Довольно часто приходться сериализовать\десериализовать объекты например при передачи их по сети. Вместо того, чтобы передавать MessageID и потом, расспознав его, принимать остальную часть сообщения, можно использовать библиотеку которая будет выполнять эту работу сама. Одной из библиотек котороя обладает вышеописанной функциональностью является boost::serialization По ссылке находится вполне исчерпывающая документация, но я столкнулся со сложностью и внятного ответа в документации не нашел. Проблема была в следующем, хотелось бы иметь возможность передавать по сети объекты наследованные от какого-нибудь базового класса и затем десериализовать их через указатель на базовый класс. Например:

 
class Base
{
};
 
class Derived:public Base
{
  int nValue;
};
 
//....
 
void save()
{
  Base* pDerived = new Derived;
  binarystream_out << pDerived;
};
 
void load()
{
  Base* pDerived = 0;
  binarystream_in >> pDerived;
};
 

Проблема заключается в том, что при десериализации член nValue класса Derived не будет корректно десериализован, он будет содержать какой-то мусор. В примерах к библиотеке эта проблема решается оригинальным способом, первый раз десериализовать объект явно указав его тип.

 
void load()
{
  Derived* pDerived ;
  binarystream_in >> pDerived;
  //после этого класс регистрируется  и ниже в коде можна вызывать
  Base* pDerived2;
  binarystream_in >> pDerived2;
  //десериализация проходит корректно
};
 

Наверное нелишним будет упомянуть, что я столкнулся с этой же ситуацией в MFC и долго просидел в дебагере пока понял что не так.

Проблема решается достаточно просто, достаточно зарегистрировать класс в input stream.

 
void load()
{
  Base* pDerived ;
  binarystream_in.register_type(static_cast<Derived*>(0));
  binarystream_in >> pDerived;
};
 

boost::serialization example