Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: sorush-rОтветов: 1

Я хотел бы сериализовать экземпляры класса и отправить их по 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 исключением.

c++boostserializationboost-asio

Ответы

Ответ 1 · рейтинг 1 · Tom

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

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы