Сериализация объектов C ++ для Linux - PullRequest
2 голосов
/ 06 июля 2010

Я делаю программу, которая должна отправлять и получать данные по сети. Я никогда не занимался сериализацией объектов. Я прочитал несколько рекомендаций по Boost и буферам протокола Google. Для использования в Linux, что является лучшим?

Если вы знаете кого-то другого, я буду признателен за вашу помощь.

Спасибо.

Ответы [ 2 ]

6 голосов
/ 06 июля 2010

Я использовал 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;

Обратите внимание, что этот пример довольно тривиален, и, очевидно, когда вы представляете сеть, вы будете использовать сокеты и буферы.

1 голос
/ 06 июля 2010

Если вы передаете данные по сети, я предлагаю использовать двоичную форму сериализации (не XML или аналогичную). Qt предлагает классы для этого , которые позволяют вам передавать любой класс, известный мета-системе Qt, в поток данных.

Проблема в том, что C ++ на самом деле не поддерживает интроспекцию как языковую функцию, поэтому вам нужно знать данные, которые должны быть сериализованы.

Во многих случаях индикатор длины (используйте big-endian), за которым следуют данные, является хорошим способом сериализации данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...