二进制序列化使用Boost和uint8_t

Binary Serialization Using Boost and uint8_t

本文关键字:uint8 Boost 序列化 二进制      更新时间:2023-10-16

处理二进制数据时,我倾向于使用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;
}

二进制存档采用std::istream/std::ostream参数,因此您只能使用std::basic_istream<char>/std::basic_ostream<char>

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