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)。

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

尝试这个:

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 回答