0

ネストされたオブジェクトをシリアル化するにはどうすればよいですか?

例:

class B
{
public:
    int y;

    template<class Archive>
    void serialize(Archive& ar)
    {
        ar(CEREAL_NVP(y));
    }
}

class A
{
public:
    int x;
    std::vector<B> nested;

    template<class Archive>
    void serialize(Archive& ar)
    {
        ar(CEREAL_NVP(x) what about nested? )
    }  
}

主なアイデアは、次のようなものを持つことです

{
   "x": ...
   "nested": [
      {
         "y": ...
      },
      {
         "y": ...
      }
   ]
}

ところで、よろしければ 2 番目の質問です。このようなjsonからAオブジェクトを再度取得できますか? みんなありがとう=)

4

1 に答える 1

1

std::vectorシリアル化( )のサポートを組み込み#include <cereal/types/vector.hpp>、アーカイブへの呼び出しに追加するだけです。

ar(CEREAL_NVP(x), CEREAL_NVP(nested));

以下は、JSON に保存してからデータをロードする方法も示す完全な例です。

#include <cereal/archives/json.hpp>
#include <cereal/types/vector.hpp>

class B
{
  public:
    int y;

    template<class Archive>
    void serialize(Archive& ar)
    {
      ar(CEREAL_NVP(y));
    }
};

class A
{
  public:
    int x;
    std::vector<B> nested;

    template<class Archive>
    void serialize(Archive& ar)
    {
      ar(CEREAL_NVP(x), CEREAL_NVP(nested) );
    }
};

int main()
{
  std::stringstream ss;
  {
    cereal::JSONOutputArchive ar(ss);
    A a = {3, {{3},{2},{1}}};
    ar( a );
  }

  std::cout << ss.str() << std::endl;

  {
    cereal::JSONInputArchive ar(ss);
    A a;
    ar( a );

    cereal::JSONOutputArchive ar2(std::cout);
    ar2(a);
  }
}

出力として次のようになります。

{
    "value0": {
        "x": 3,
        "nested": [
            {
                "y": 3
            },
            {
                "y": 2
            },
            {
                "y": 1
            }
        ]
    }
}
{
    "value0": {
        "x": 3,
        "nested": [
            {
                "y": 3
            },
            {
                "y": 2
            },
            {
                "y": 1
            }
        ]
    }
}
于 2016-10-17T19:50:55.267 に答える