C++/Cereal:从 JSON 反序列化到拥有 class 时出现异常
C++/Cereal: Exception while deserializing from JSON to own class
我正在尝试在 VS2013 上使用谷物 (v1.12) 将 JSON 文件中的参数加载到我自己的参数 class 中。
编译并加载到 POD 中工作正常,但加载到我自己的 class 中会抛出 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 标量。
另一方面,load/save 将 C++ 对象 from/to 序列化为 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
不是标量而是对象。所以谷物预计
{
"bool": false,
"scalar": {
"value": 3
}
}
如果要将结构序列化为标量,则必须为其提供 minimal_load 函数。参见 http://uscilab.github.io/cereal/serialization_functions.html "minimal split serialization"。
我正在尝试在 VS2013 上使用谷物 (v1.12) 将 JSON 文件中的参数加载到我自己的参数 class 中。
编译并加载到 POD 中工作正常,但加载到我自己的 class 中会抛出 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 标量。
另一方面,load/save 将 C++ 对象 from/to 序列化为 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
不是标量而是对象。所以谷物预计
{
"bool": false,
"scalar": {
"value": 3
}
}
如果要将结构序列化为标量,则必须为其提供 minimal_load 函数。参见 http://uscilab.github.io/cereal/serialization_functions.html "minimal split serialization"。