【问题标题】:Cereal JSON output misses closing curly brace谷物 JSON 输出缺少右花括号
【发布时间】:2015-05-12 14:42:38
【问题描述】:

我正在使用Cereal C++ v1.1.1,类似于文档中给出的example,我正在尝试以下操作:

#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

【问题讨论】:

    标签: c++ json cereal


    【解决方案1】:

    我遇到了同样的问题,并在 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;
    }
    

    有关详细信息,请参阅文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-31
      • 2018-04-10
      • 1970-01-01
      • 2021-11-10
      • 2012-11-01
      • 2019-05-08
      相关资源
      最近更新 更多