5

ブーストを使用してc++オブジェクトをファイルにシリアル化するのは本当に簡単です。

std::ofstream ofile( lpszFileName );
boost::archive::text_oarchive oa(ofile);
oa << m_rgPoints;

しかし、どうすればc ++オブジェクトを生のメモリブロックにシリアル化できますか?

出力ファイルストリームをメモリに読み込む必要がありますか、それとも他のより良い方法がありますか?

ありがとう。

4

4 に答える 4

7

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/

これにより、不要な一時ファイルを回避できます。

于 2012-06-20T08:03:21.763 に答える
5

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";
于 2012-06-20T08:16:38.230 に答える
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ですstd::byteのリファレンスでreinterpret_cast詳しく説明されているように、ポインタをaにキャストし、それをbyte *逆参照することができます。したがって、次のようなコードを使用できます。

// buf is a pointer to a raw block of memory, size its size
// oa is a boost archive
auto start_buf = reinterpret_cast<byte *>(buf);
std::vector<std::byte> vec(start_buf, start_buf + size);
oa << vec;

ただし、これはコピーを意味します。

于 2020-04-28T04:31:13.330 に答える
-1

私が理解しているなら、バイナリシリアル化が必要ですboost::archive::binary_oarchive。次に、ストリームからデータをコピーできます。

于 2012-06-20T07:52:13.280 に答える