Сериализация объектов сетевого протокола в C ++ - PullRequest
1 голос
/ 06 декабря 2009

Я пишу код на C ++, который должен будет отправлять данные по TCP / IP. Я хочу, чтобы этот код был переносимым в Linux / Windows / Osx. Теперь, когда я пишу код переносимой сети впервые, мне нужно добавить несколько простых функций к определенным объектам, таким как:

class myclass{

...member...

public:

  string serialize(){
    std::ostringstream out();
    out << member1;
    out << member2;
    out << member3;
    return out.str();
  }

}

... это все, что мне сейчас нужно. В любом случае, я начал читать документы, связанные с ostringstream, и выяснил, что проблема с бинарным / текстовым текстом. Фактически он преобразует разрывы строк в правильную последовательность everysystem. Предположим, например, что член является указателем на const char * foo = "Hello \ nMan \ n", который будет транслироваться в определенной последовательности байтов в Linux, другой в Windows ... и так далее. Мои байты будут отправляться через пакет через Интернет, их будет читать другая операционная система, и я думаю, что возникнут проблемы ... Теперь я прочитал, что могу инициализировать ostringstream с ostringstream(ios::bin) ... Решит ли это проблему ( при условии, что я буду использовать функцию десериализации, которая будет использовать istringstream(ios::bin). Я запутался во всей картине, если вы можете потратить несколько уточняющих строк, которые будут высоко оценены.

Спасибо.

Ответы [ 3 ]

9 голосов
/ 06 декабря 2009

Зачем делать все вручную, если есть отличные библиотеки, такие как Boost.Serialization , на которых вы можете построить?

Из своих целей:

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

Также вас могут заинтересовать пункты 4 и 5:

  • Глубокий указатель сохранения и восстановления. То есть сохранение и восстановление указателей сохраняет и восстанавливает указанные данные.
  • Правильное восстановление указателей на общие данные.
8 голосов
/ 06 декабря 2009

Seconded - используйте протестированную библиотеку сериализации, подобную вышеупомянутой Boost :: Serialization или Буферы протокола Google . Они не должны вводить дальнейшие зависимости.

Если вы открыты для целого нового фреймворка, то Qt также имеет Сериализация Qt

0 голосов
/ 17 мая 2010

Другим вариантом является ACE framework. Он обеспечивает сериализацию / десериализацию с распределением CORBA (см. Классы ACE_InputCDR и ACE_OutputCDR ). Если вы не знаете ACE, это огромная среда, включающая полную среду выполнения CORBA. Но вам нужны только основные библиотеки ACE для сериализации.

...