谷歌JSON输出错过了结束大括号

Yan*_*oto 5 c++ json cereal

我正在使用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!
}
Run Code Online (Sandbox Code Playgroud)

我希望有以下内容:

{
  "x":12
}
Run Code Online (Sandbox Code Playgroud)

但是结束的大括号丢失了.知道代码中缺少什么吗?

更新:

添加archive.finishNode()似乎解决了问题.但我会说这不是解决方案.根据operator()文档,调用操作符序列化输入参数,为什么要添加finishNode额外的?

Sam*_*on3 10

我遇到了同样的问题,并在对谷歌GitHub上提交的问题的评论中找到了解决方案:https://github.com/USCiLab/cereal/issues/101

该文档指出"档案被设计为以RAII方式使用,并保证仅在销毁时才刷新其内容......"(http://uscilab.github.io/cereal/quickstart.html).

您的问题是您在销毁存档之前尝试打印字符串流的内容.此时,存档不知道您将来是否想要向其写入更多数据,因此它不会流出结束括号.在打印字符串流之前,您需要确保已调用存档的析构函数.

试试这个:

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

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅文档.