JS20ファイルのパラメータをVS2013のシリアル(v1.12)を使用して独自のパラメータクラスにロードしようとしています。C++ /シリアル: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を示していますRapidJSON内部244は、例外をスローします:
ConstMemberIterator MemberEnd() const
{ RAPIDJSON_ASSERT(IsObject()); return data_.o.members + data_.o.size; }
しかし、私はそれをどうしたらいいのか分かりません。コードを動作させるにはどうすればよいですか?
ありがとうございます!溶液で
UPDATE:
ChrisBFXによって書かれたように、JSONスカラーにC++オブジェクトをデシリアライズするためにload_minimal/save_minimalを実装する必要があります。
一方、load/saveは、C++オブジェクトをJSONオブジェクトとの間でシリアル化します。私のコードについては
、負荷()関数は、このことによって除去し、交換する必要があります。今、それは魔法のように動作
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;
};
! :-)
ありがとう、それはまさに問題でした! load_minimal/save_minimalを実装した後、コードは私が望むものを実行します:-) – sidn