2

VS2013 でシリアル (v1.12) を使用して、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
}

コール スタックをたどると、RapidJSON 内の document.h:244 が例外をスローすることがわかります。

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

しかし、私はそれをどうするかわかりません。コードを機能させるにはどうすればよいですか?

どうもありがとう!

解決策で更新:

ChrisBFX が書いたように、C++ オブジェクトを JSON スカラーに逆シリアル化するには、load_minimal/save_minimal を実装する必要があります。

一方、load/save は、JSON オブジェクトとの間で C++ オブジェクトをシリアライズします。

私のコードでは、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;
};

今では魅力のように機能します!:-)

4

1 に答える 1

2

あなたCMStructはスカラーではなくオブジェクトです。だから穀物は期待しています

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

構造体をスカラーとしてシリアライズしたい場合は、minimal_load 関数を提供する必要があります。http://uscilab.github.io/cereal/serialization_functions.html「最小限の分割シリアル化」を参照してください。

于 2016-07-06T16:27:06.137 に答える