2016-07-06 27 views
1

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; 
}; 

! :-)

答えて

1

CMStructはスカラーではなくオブジェクトです。したがって、シリアルが期待しています

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

structをスカラーとしてシリアル化する場合は、minimal_load関数を指定する必要があります。 http://uscilab.github.io/cereal/serialization_functions.html「最小分割シリアル化」を参照してください。

+0

ありがとう、それはまさに問題でした! load_minimal/save_minimalを実装した後、コードは私が望むものを実行します:-) – sidn

関連する問題