Я использовал Boost.Serialization для сериализации объектов и передачи их через сокет. Это очень гибкая библиотека, объекты могут быть навязчиво сериализованы, если у вас есть доступ к ним
class Foo
{
public:
template<class Archive>
void serialize(Archive& ar, const unsigned int version)
{
ar & _foo;
ar & _bar;
}
int _foo;
int _bar;
};
или ненавязчиво, если у вас нет доступа к объекту, который нужно сериализовать
namespace boost {
namespace serialization {
template<class Archive>
void serialize(Archive& ar, Foo& f, const unsigned int version)
{
ar & f._foo;
ar & f._bar;
}
} // namespace serialization
} // namespace boost
Существуют приемы для сериализации Foo, если он не раскрывает своих членов (_foo
и _bar
здесь), документация объясняет это довольно хорошо. Для сериализации Foo
вы используете объект в пространстве имен boost::archive
: текстовый, двоичный или xml.
std::stringstream ss;
boost::archive::text_oarchive ar( ss );
Foo foo;
foo._foo = 1;
foo._bar = 2;
ar << foo;
реконструкция архива в объект Foo выполняется следующим образом
boost::archive::text_iarchive ar( ss );
Foo foo
ar >> foo;
Обратите внимание, что этот пример довольно тривиален, и, очевидно, когда вы представляете сеть, вы будете использовать сокеты и буферы.