如何序列化为原始内存块?

时间:2012-06-20 07:33:07

标签: c++ serialization boost

使用boost,

将c ++对象序列化为文件非常容易
std::ofstream ofile( lpszFileName );
boost::archive::text_oarchive oa(ofile);
oa << m_rgPoints;

但是我如何将c ++对象序列化为原始内存块呢?

我应该将输出文件流读入内存还是有其他更好的方法?

感谢。

4 个答案:

答案 0 :(得分:5)

根据James Kanze的评论编辑:

您可以序列化为std::ostringstream

std::ostringstream oss;
boost::archive::text_oarchive oa(oss);
oa << m_rgPoints;

然后通过获取std::streambuf(调用oss.rdbuf())并在其上调用streambuf::sgetn来读取数据到您自己的缓冲区中来阅读。

http://www.cplusplus.com/reference/iostream/ostringstream/rdbuf/

这可以避免不必要的临时文件。

答案 1 :(得分:4)

你可以编写自己的streambuf类,它直接在你的记忆中起作用:

class membuf : public std::streambuf
{
public:
  membuf( char * mem, size_t size )
  {
    this->setp( mem, mem + size );
    this->setg( mem, 0, mem + size );
  }
  int_type overflow( int_type charval = traits_type::eof() )
  {
    return traits_type::eof();
  }
  int_type underflow( void )
  {
    return traits_type::eof();
  }
  int sync( void )
  {
    return 0;
  }
};

使用此课程:

  membuf buf(address,size);
  ostream os(&buf);
  istream is(&buf);

  oss << "Write to the buffer";

答案 2 :(得分:0)

如果我理解你需要二进制序列化boost::archive::binary_oarchive。然后,您可以从流中复制数据。

答案 3 :(得分:0)

实际上有一个二进制原始数据binary_object的序列化包装器。

您可以像这样使用它:

// buf is a pointer to a raw block of memory, size its size
// oa is a boost archive
boost::serialization::binary_object buf_wrap(buf, size);
oa << buf_wrap

使用c ++ 17的另一个选项是将缓冲区转换为std::vector的{​​{1}}。如reference of reinterpret_cast中所述,允许将指针强制转换为std::byte并取消引用。因此,可以使用如下代码:

byte *

但是,这意味着有副本。