首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++/Cereal:从JSON反序列化到自己的类时的异常

C++/Cereal:从JSON反序列化到自己的类时的异常
EN

Stack Overflow用户
提问于 2016-07-06 14:06:14
回答 1查看 1.9K关注 0票数 2

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

编译和加载到POD可以很好,但是加载到我自己的类中会抛出cereal::RapidJSONException

这是我的代码:

代码语言:javascript
复制
#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文件:

代码语言:javascript
复制
{
    "bool": false,
    "scalar": 3
}

在调用堆栈之后,document.h:244在RapidJSON中抛出异常:

代码语言:javascript
复制
ConstMemberIterator MemberEnd() const
{ RAPIDJSON_ASSERT(IsObject()); return data_.o.members + data_.o.size; }

但是,我不知道该怎么做。我如何使我的代码工作?

非常感谢!

用解决方案更新

正如ChrisBFX编写的那样,要将C++对象反序列化为JSON标量,就必须实现load_minimal/save。

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

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

代码语言:javascript
复制
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;
};

现在它就像一种魅力!:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-06 16:27:06

您的CMStruct不是标量而是对象。所以麦片希望

代码语言:javascript
复制
{
    "bool": false,
    "scalar": {
        "value": 3
    }
}

如果要将结构序列化为标量,则必须为其提供一个minimal_load函数。请参见functions.html“最小拆分序列化”。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38226062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档