6

私はCereal C++ v1.1.1を使用しており、ドキュメントに記載されていると同様に、次のことを試みています:

#include <sstream>
#include <iostream>
#include <cereal/archives/json.hpp>

int main() {
  std::ostringstream os;
  cereal::JSONOutputArchive archive(os);
  int x = 12;
  archive(CEREAL_NVP(x));
  std::cout << os.str(); // JUST FOR DEMONSTRATION!
}

私は次のことを期待しています:

{
  "x":12
}

しかし、閉じ中括弧がありません。コードに何が欠けているか分かりますか?

アップデート:

追加archive.finishNode()すると問題が解決するようです。しかし、それは解決策ではないと言いたい。ドキュメントによるとoperator()、オペレーターを呼び出すと入力パラメーターがシリアル化されますが、なぜ追加する必要があるのfinishNodeですか?

4

1 に答える 1

12

私は同じ問題を抱えていましたが、Cereal の GitHub に提出された問題に関するコメントで解決策を見つけました: https://github.com/USCiLab/cereal/issues/101

ドキュメントには、「アーカイブは RAII の方法で使用するように設計されており、破棄時にのみコンテンツをフラッシュすることが保証されています...」( http://uscilab.github.io/cereal/quickstart.html ) と記載されています。

問題は、アーカイブが破棄される前に stringstream の内容を印刷しようとしていることです。この時点で、アーカイブは将来さらにデータを書き込む必要があるかどうかわからないため、閉じ括弧のストリーミングを控えます。文字列ストリームを出力する前に、アーカイブのデストラクタが呼び出されていることを確認する必要があります。

これを試して:

int main()
{
  std::stringstream ss;
  {
    cereal::JSONOutputArchive archive( ss );
    SomeData myData;
    archive( myData );
  }
  std::cout << ss.str() << std::endl;

  return 0;
}

詳細については、ドキュメントを参照してください。

于 2015-05-15T21:56:05.180 に答える