2016-10-13 13 views
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": ... 
     } 
    ] 
} 

Кстати, второй вопрос, если позволите. Могу ли я из json, как это, снова получить объект A? Спасибо вам, ребята =)

ответ

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