我试图在VS2013上使用谷物(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
}在调用堆栈之后,document.h:244在RapidJSON中抛出异常:
ConstMemberIterator MemberEnd() const
{ RAPIDJSON_ASSERT(IsObject()); return data_.o.members + data_.o.size; }但是,我不知道该怎么做。我如何使我的代码工作?
非常感谢!
用解决方案更新:
正如ChrisBFX编写的那样,要将C++对象反序列化为JSON标量,就必须实现load_minimal/save。
另一方面,加载/保存将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;
};现在它就像一种魅力!:)
发布于 2016-07-06 16:27:06
您的CMStruct不是标量而是对象。所以麦片希望
{
"bool": false,
"scalar": {
"value": 3
}
}如果要将结构序列化为标量,则必须为其提供一个minimal_load函数。请参见functions.html“最小拆分序列化”。
https://stackoverflow.com/questions/38226062
复制相似问题