我正在使用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).
您的问题是您在销毁存档之前尝试打印字符串流的内容.此时,存档不知道您将来是否想要向其写入更多数据,因此它不会流出结束括号.在打印字符串流之前,您需要确保已调用存档的析构函数.
试试这个:
Run Code Online (Sandbox Code Playgroud)int main() { std::stringstream ss; { cereal::JSONOutputArchive archive( ss ); SomeData myData; archive( myData ); } std::cout << ss.str() << std::endl; return 0; }有关更多信息,请参阅文档.