Ich versuche, Parameter aus einer JSON-Datei in meine eigene Parameterklasse mit Getreide (v1.12) auf VS2013 zu laden.C++/Cereal: Ausnahme beim Deserialisieren von JSON in eigene Klasse
Kompilieren und Laden in einen POD funktioniert gut, aber das Laden in meine eigene Klasse wirft cereal::RapidJSONException
.
Hier ist mein Code:
#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;
}
Die JSON-Datei:
{
"bool": false,
"scalar": 3
}
den Call-Stack Nach zeigt, dass document.h: 244 innen RapidJSON die Ausnahme auslöst:
ConstMemberIterator MemberEnd() const
{ RAPIDJSON_ASSERT(IsObject()); return data_.o.members + data_.o.size; }
Allerdings habe ich keine Ahnung, was ich davon halten soll. Wie kann ich meinen Code arbeiten lassen?
Vielen Dank!
UPDATE MIT LÖSUNG:
Wie ChrisBFX geschrieben, ist es notwendig load_minimal/save_minimal um deserialisiert ein C++ Objekt zu einem JSON Skalar zu implementieren.
load/save serialisiert dagegen ein C++ - Objekt von/zu einem JSON-Objekt. es
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;
};
Jetzt wirkt wie ein Zauber:
Für meinen Code, die Last() Funktion, die durch diese entfernt und ersetzt werden! :-)
Danke, das war genau das Problem! Nach der Implementierung von load_minimal/save_minimal tut der Code, was ich will :-) – sidn