Предпочтительный способ сериализации объекта с помощью Boost/C++ в двоичном формате

Я хотел бы сериализовать экземпляры класса и отправить их по TCP-соединению с использованием библиотек C++/Boost. Существует слишком много рабочих примеров... Некоторые используют текстовые потоки для буферов, а некоторые используют tcp::iostream. Я не уверен, какой из них подходит для моих нужд.

Требования:

  1. Переносимость на разные архитектуры (порядок байтов и разрядность не должны быть проблемой)
  2. Данные должны быть в двоичном формате. (нет текста)

Текущий код:

// Client side:
boost::asio::streambuf b;
std::ostream os(&b);
boost::archive::binary_oarchive oa(os);
message m; // The `message' class is serializable
// construct `m'
oa << m;
boost::asio::write(socket,b.data(),boost::asio::transfer_all());

// Server side:
boost::asio::streambuf b;
std::istream is(&b);
boost::archive::binary_iarchive ia(is);
boost::asio::read(socket,b,boost::asio::transfer_all());
message m;
ia >> m;

Который не работает. Сервер завершает работу с invalid signature исключением.


person sorush-r    schedule 17.05.2013    source источник


Ответы (1)


Вы обязаны использовать Boost? Похоже, что есть аналогичный вопрос SO здесь - есть ответ, который ссылается на раздел TODO Boost Serialization (вот последний) - похоже, переносимый двоичный архив все еще находится в списке TODO автора, поэтому я не уверен, что есть решение Boost (пока), которое удовлетворяет вашим требованиям.

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

Альтернативы для просмотра:

  • Буферы протокола Google (GPB) — эта библиотека предназначена для независимых от платформы и языка коммуникация. Вместо того, чтобы создавать класс «сообщение» и определять сериализацию, вы определяете элемент на языке спецификации GPB, а GPB предоставляет инструменты для анализа этой спецификации и генерации кода для упорядочения/деупорядочения этого элемента.
  • SLICE — аналогично GPB, но с более богатым языком спецификации

Надеюсь, это натолкнет вас на новые идеи.

person Tom    schedule 17.05.2013
comment
Я пытаюсь написать переносимый код (как можно больше). Это причина использовать boost. В настоящее время я могу игнорировать бинарную переносимость по архитектурам. Хотя вышеприведенное даже не работало на той же машине... Мне все равно нужна помощь по поводу Двоичной сериализации с помощью Boost ASIO/Serialization. - person sorush-r; 18.05.2013
comment
Поэтому я принимаю этот ответ и задаю другой вопрос SO. Спасибо - person sorush-r; 18.05.2013
comment
Я понизлю этот ответ, так как меня интересует то, что спросил ОП, и вы пошли по совершенно другому пути. Как насчет ответа на вопрос, который был задан?? - person CashCow; 17.07.2017