C++/ Cereal : Exception while deserializing from JSON to own class

标签 c++ json deserialization cereal

我正在尝试在 VS2013 上使用 Cereal (v1.12) 将参数从 JSON 文件加载到我自己的参数类中。

编译并加载到 POD 中工作正常,但加载到我自己的类中会抛出 cereal::RapidJSONException

这是我的代码:

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

struct CMyStruct {
    CMyStruct(int f_value) : m_value(f_value) {}
    int   m_value;
};

template<class Archive> void load(Archive& ar, CMyStruct& parameter) {
    int input;
    ar(input);
    parameter.m_value = input;
};

void test_cereal() {    
    int l_scalar_i(42);
    CMyStruct l_scalar(42);

    std::ifstream l_jsonFile("example_minimal.json");
    cereal::JSONInputArchive l_ar(l_jsonFile);

    l_ar( cereal::make_nvp("scalar", l_scalar_i) ); // WORKS
    l_ar( cereal::make_nvp("scalar", l_scalar) );   // throws cereal::RapidJSONException

    return;
}

JSON 文件:

{
    "bool": false,
    "scalar": 3
}

调用堆栈显示,RapidJSON 内的 document.h:244 抛出异常:

ConstMemberIterator MemberEnd() const
{ RAPIDJSON_ASSERT(IsObject()); return data_.o.members + data_.o.size; }

但是,我不知道该怎么做。我怎样才能让我的代码工作?

非常感谢!

更新解决方案:

正如 ChrisBFX 所写,必须实现 load_minimal/save_minimal 才能将 C++ 对象反序列化为 JSON 标量。

另一方面,加载/保存将 C++ 对象从 JSON 对象序列化到 JSON 对象。

对于我的代码,必须删除 load() 函数并将其替换为:

template<class Archive>
int save_minimal(const Archive& ar,
    const CMyStruct& parameter)
{
    return parameter.m_value;
};

template<class Archive>
void load_minimal(const Archive& ar,
    CMyStruct& parameter,
    const int & value_i)
{
    parameter.m_value = value_i;
};

现在它就像一个魅力! :-)

最佳答案

您的 CMStruct 不是标量而是对象。所以 Cereal 预计

{
    "bool": false,
    "scalar": {
        "value": 3
    }
}

如果你想将你的结构序列化为标量,你必须为其提供一个minimal_load函数。请参阅http://uscilab.github.io/cereal/serialization_functions.html “最小分割序列化”。

关于C++/ Cereal : Exception while deserializing from JSON to own class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38226062/

相关文章:

C++帮助类继承

javascript - 如何使用 python Flask 应用程序在 d3js 图表中动态加载 json 数据

css - FullCalendar:通过 'addEventSource' 为一整天添加背景色,而不是为事件单独添加

python - 保存三阶张量序列并在不丢失数组格式的情况下读回它

java - 序列化一个静态类

c++ - 分配给右值 : why does this compile?

c++ - 使用 C++11 随机库生成随机数

java - Spring - @RequestBody 阻止请求?

c# - 在 WCF 中反序列化 JSON

c++ - 12个元素的数组-求数-练习