Как сериализировать объект отправить по сети

Я пытаюсь сериализировать объекты отправить по сети через сокет с помощью только STL. Я не нахожу способ сохранить структуру объектов, которая будет десериализована в другом хосте. Я пытался преобразовать в string, к char* и я провел долгое время, ища учебные руководства в Интернете, и до сих пор я ничего не нашел.

Существует ли способ сделать это только с STL?

Есть ли какие-либо хорошие учебные руководства?

Я почти пробую повышение, но если существует то, как сделать это с STL, который я хотел бы изучить.

8
задан jleahy 7 March 2013 в 19:45
поделиться

3 ответа

У меня получилось!

Я использовал strinstream для сериализации объектов и отправил его как сообщение, используя метод str() stringstream и c_str() string.

Смотрите.

class Object {
public:
int a;
string b;

void methodSample1 ();
void methosSample2 ();

friend ostream& operator<< (ostream& out, Object& object) {
out << object.a << " " << object.b;   //The space (" ") is necessari for separete elements
return out;
}

friend istream& operator>> (istream& in, Object& object) {
in >> object.a;
in >> object.b;
return in;
}
};

/* Server side */
int main () {
Object o;
stringstream ss;
o.a = 1;
o.b = 2;
ss << o;    //serialize

write (socket, ss.str().c_str(), 20); //send - the buffer size must be adjusted, it's a sample
}

/* Client side */
int main () {
Object o2;
stringstream ss2;
char buffer[20];
string temp;

read (socket, buffer, 20);  //receive
temp.assign(buffer);
ss << temp;
ss >> o2;   //unserialize
}

Я не уверен, нужно ли конвертировать в строку перед сериализацией (ss << o), возможно, это возможно непосредственно из char.

0
ответ дан 5 December 2019 в 12:54
поделиться

Вы можете сериализовать что угодно. Всякая сериализация означает, что вы конвертируете объект в байты, чтобы вы могли отправить его в потоке (например, std :: ostream ) и прочитать его другим (например, std :: istream ). Просто переопределите оператор << (std :: ostream &, const T &) и оператор >> (std :: istream &, T &) где T - каждый из ваших типы. И все типы, содержащиеся в ваших типах.

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

7
ответ дан 5 December 2019 в 12:54
поделиться

Мой первый вопрос: хотите ли вы сериализацию или обмен сообщениями?

Сначала это может показаться глупым, поскольку вы просили сериализацию, но я всегда различал эти два термина.

  • Сериализация - это создание снимка вашей памяти и последующее ее восстановление. Каждый объект представлен как отдельный объект (хотя они могут быть составлены)
  • Обмен сообщениями - это отправка информации из одной точки в другую. Сообщение обычно имеет собственную грамматику и может не отражать организацию вашей бизнес-модели.

Слишком часто я видел людей, использующих сериализацию там, где следовало использовать обмен сообщениями. Это не означает, что сериализация бесполезна, но это означает, что вы должны думать заранее. Довольно сложно изменить спецификацию, если вы решили сериализовать ее, особенно если вы решили переместить некоторую часть информации (переместить ее с одного объекта на другой) ... потому что как тогда вы собираетесь декодировать "старые" сериализованные версия?

Теперь, когда это прояснилось ...

... Я порекомендую Google Protocol Buffer.

Вы можете полностью переписать свой собственный, используя STL, но в конечном итоге вы будете выполнять уже проделанную работу, и если вы не хотите извлекать уроки из нее, это бессмысленно.

В protobuf замечательно то, что он в некотором смысле не зависит от языка: то есть вы можете сгенерировать кодировщик / декодер данного сообщения для C ++, Java или Python. Использование Python удобно для внедрения сообщений (тестирования) или декодирования сообщений (для проверки вывода записанного сообщения). Это было бы непросто, если бы вы использовали STL.

5
ответ дан 5 December 2019 в 12:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: