5

シリアルライブラリを使用して配列をシリアル化できますか、またはどのようにシリアル化しますか。

いえ

void save(Archive & ar, const unsigned int version) const
{
    unsigned int l  = g1_size_bin(g,POINT_COMPRESS);
    uint8_t data[l];
    memset(data, 0, l);
    g1_write_bin(data, l, g,POINT_COMPRESS);
    ar(l);
    ar(data); // what should be here
}

それは機能しません (また、私もそれを期待しません)。そうでもない

ar(cereal::binary_data(data,l)); 

(使用するブーストコードのように見えるので、これはうまくいくと思います)、コンパイルエラーが発生します:

/usr/local/include/cereal/cereal.hpp:79:17: 注: 候補テンプレートは無視されました: 置換エラー: 可変的に変更された型 'unsigned char (&)[l]' はテンプレート引数として使用できません BinaryData binary_data( T && data, size_t size )

そうでもない

ar.saveBinaryValue(data,l);

そのメソッドは XML/Json でのみサポートされているように見えるため、バイナリ アーカイブが必要です。

4

1 に答える 1

9

cereal::binary_dataPOD 配列のバイナリ表現が必要であると仮定すると、この場合に使用する正しい構造です。binary_dataこれは、 (binary および Portable_binary) をサポートするアーカイブに対してのみ機能します。binary_dataより一般的なシリアル化方法の最適化と見なされるため、テキストベースのアーカイブでは機能しません。この例については、ベクトルがシリアル化される方法を参照してください。

とにかく、これはCスタイルの配列をシリアライズする実際の例です:

#include <cereal/archives/binary.hpp>
#include <iostream>

int main()
{
  std::stringstream ss;

  {
    cereal::BinaryOutputArchive ar(ss);
    std::uint8_t data[] = {1, 2, 3};
    ar( cereal::binary_data( data, sizeof(std::uint8_t) * 3 ) );
  }

  {
    cereal::BinaryInputArchive ar(ss);
    std::uint8_t data[3];
    ar( cereal::binary_data( data, sizeof(std::uint8_t) * 3 ) );

    for( int i : data )
      std::cout << i << " ";
  }

  return 0;
}

C スタイルの配列をテキスト ベースのアーカイブにシリアル化する場合、または配列が POD 型を超えていない場合は、各オブジェクトを反復処理して個別にシリアル化する必要があります。

于 2015-01-02T22:24:10.457 に答える