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; };