Двоичная сериализация с использованием Boost и uint8_t

При работе с двоичными данными я склонен использовать uint8_t, Я думаю, это просто похоже на тип байта для меня. Однако я не могу понять, как заставить двоичную сериализацию в boost работать с этим типом. Я спрашиваю о невозможном или просто упускаю что-то простое?

Этот пример программы не компилируется на VS2013 с некоторой жалобой на то, что он не собирается конвертировать потоки в std::ostream или же std::istream,

Программа отлично работает с char вместо uint8_t, но это беспокоит меня.:)

#include <cstdlib> // EXIT_SUCCESS
#include <vector>

#include "boost/archive/binary_iarchive.hpp"
#include "boost/archive/binary_oarchive.hpp"
#include "boost/iostreams/device/array.hpp"
#include "boost/iostreams/device/back_inserter.hpp"
#include "boost/iostreams/stream_buffer.hpp"

int main(int argc, char** argv)
{
   typedef std::vector< uint8_t > Buffer;
   Buffer buffer;

   // Serialization
   {
      int foo = 1;

      typedef boost::iostreams::back_insert_device< Buffer > Device;
      Device device(buffer);

      typedef boost::iostreams::stream_buffer< Device > Stream;
      Stream stream(device);

      {
         boost::archive::binary_oarchive archive(stream);
         archive << foo;
      }
   }

   // Deserialization
   {
      int foo;

      typedef boost::iostreams::basic_array_source< uint8_t > Device;
      Device device(buffer.data(), buffer.size());

      typedef boost::iostreams::stream_buffer< Device > Stream;
      Stream stream(device);

      {
         boost::archive::binary_iarchive archive(stream);
         archive >> foo;
      }
   }

   return EXIT_SUCCESS;
}

1 ответ

Решение

Бинарные архивы занимают std::istream / std::ostream аргумент, так что вы застряли с помощью std::basic_istream<char> / std::basic_ostream<char>,

Между прочим, нет гарантии, что реализации предлагают unsigned char / uint8_t версии потоков (точнее std::char_traits<unsigned char>).

Другие вопросы по тегам