Как я могу сериализовать и отправить std :: list по сети? - PullRequest
3 голосов
/ 15 ноября 2011

Мне нужно отправить динамически изменяемый список данных, хранящихся в std :: list, по сетевому соединению. Я хотел бы сделать это за один проход, используя сериализацию, а не отправлять каждый элемент в отдельности. Есть предложения?

Ответы [ 2 ]

5 голосов
/ 15 ноября 2011

boost::serialization делает это довольно легко сделать. Он предоставляет всю необходимую механику для std::list бесплатно, все, что вам нужно сделать, это добавить поддержку к типу, который содержит ваш список. (Если это «стандартный» тип, он уже будет существовать)

Полный пример (адаптировано из этого примера ):

#include <list>
#include <sstream>

#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
// Provide an implementation of serialize for std::list
#include <boost/serialization/list.hpp>

class foo
{
private:
  friend class boost::serialization::access;
  template<class Archive>
  void serialize(Archive & ar, const unsigned int /*version*/)
  {
    // This is the only thing you have to implement to serialize a std::list<foo>
    ar & value;
    // if we had more members here just & each of them with ar
  }
public:
  int value;
};

int main() {
  std::stringstream out;

  // setup a list
  std::list<foo> list;
  {
    const foo f = {-1};
    list.push_back(f);
  }

  // serialize into the stream
  {
    boost::archive::binary_oarchive oa(out);
    oa << list;
  }

  // read the stream into a newlist
  std::list<foo> newlist;
  {
    boost::archive::binary_iarchive ia(out);
    ia >> newlist;
  }

  std::cout << newlist.front().value << std::endl;
}

Это «отправляет» и «получает» через std::stringstream, но адаптировать его для отправки и получения через сетевой API по вашему выбору должно быть довольно тривиально.

0 голосов
/ 15 ноября 2011

Используйте xerces-C ++ для преобразования в / из XML и отправки / получения его.

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