2016-07-06 25 views
1

我試圖從JSON文件加載參數到我自己的參數類中使用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:244內部RapidJSON拋出該異常:

ConstMemberIterator MemberEnd() const 
{ RAPIDJSON_ASSERT(IsObject()); return data_.o.members + data_.o.size; } 

但是,我不知道該怎麼做。我怎樣才能讓我的代碼工作?

非常感謝!

隨溶液UPDATE:

作爲寫入通過ChrisBFX,有必要實現以反序列化C++對象到一個標量JSON load_minimal/save_minimal。

加載/保存另一方面將C++對象序列化爲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; 
}; 

現在,它就像一個魅力! :-)

回答

1

您的CMStruct不是一個標量,而是一個對象。因此,穀物預計

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

如果你想你的序列結構,你必須爲它提供一個minimal_load功能的標量。請參閱http://uscilab.github.io/cereal/serialization_functions.html「最小分割序列化」。

+0

謝謝,那正是問題!在實現load_minimal/save_minimal之後,代碼做了我想要的:-) – sidn