2016-07-06 16 views
1

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! :-)

Antwort

1

Ihr CMStruct ist kein Skalar sondern ein Objekt. So Getreide erwartet

{ 
    "bool": false, 
    "scalar": { 
     "value": 3 
    } 
} 

Wenn Sie Ihre Struktur als Skalar serialisieren möchten Sie für eine minimal_load Funktion zur Verfügung stellen müssen. Siehe http://uscilab.github.io/cereal/serialization_functions.html "minimale Split-Serialisierung".

+0

Danke, das war genau das Problem! Nach der Implementierung von load_minimal/save_minimal tut der Code, was ich will :-) – sidn

Verwandte Themen