使用Boost和uint8_t进行二进制序列化

时间:2014-07-25 05:21:38

标签: c++ boost binary-serialization binary-deserialization

使用二进制数据时,我倾向于使用uint8_t。我想这对我来说就像是一个字节的类型。但是,我无法弄清楚如何在boost中使用二进制序列化来使用该类型。我问不可能或只是遗漏了一些简单的东西吗?

此示例程序无法在VS2013上进行编译,但有一些投诉是关于不将流转换为std::ostreamstd::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 个答案:

答案 0 :(得分:4)

二进制存档会使用std::istream / std::ostream参数,因此您使用std::basic_istream<char> / std::basic_ostream<char>时会陷入困境。

顺便提一下,无法保证实施提供unsigned char / uint8_t版本的流(或更确切地说是std::char_traits<unsigned char>)。