Не удается сериализовать std::vector с помощью Cereal

Я новичок в сериализации, и у меня возникли проблемы с сериализацией std::vector объектов с помощью библиотеки Cereal. Вот пример, иллюстрирующий проблему:

class MyClass
{
    int x, y, z;

    class MyOtherClass
    {
        string name, description;

    public:

        template<class Archive>
        void serialize(Archive & archive)
        {
            archive(name, description);
        }
    };

    vector<MyOtherClass> Victor;
    vector<int> ints;

public: 

    template<class Archive>
    void serialize(Archive & archive)
    {
        archive(x, y, z, ints); // error C2338: cereal could not find any output serialization functions for the provided type and archive combination.
    }
};

Попытка сериализовать объект ints или объект Victor приводит к error C2338: cereal could not find any output serialization functions for the provided type and archive combination.

Вот код, который я использую в функции main:

MyClass MyObject;
ofstream datafile(path, ios::binary);
{ cereal::BinaryOutputArchive oarchive(datafile); oarchive(MyObject); }

Что я делаю не так?


person greentea101    schedule 27.10.2017    source источник
comment
Скорее всего, вы не читали поддержку stl части документации и забыли включать соответствующие заголовочные файлы, такие как #include <cereal/types/vector.hpp>. Поскольку ваш пример неполный, трудно сказать, но это мое предположение.   -  person spectras    schedule 27.10.2017
comment
Spectras, вы правы, спасибо. Я только прочитал страницу быстрого запуска и пару других страниц, связанных на главной странице документов. Сейчас у меня нет времени проверять, работает ли код, но я не ожидаю дальнейших проблем. Спасибо еще раз!   -  person greentea101    schedule 27.10.2017


Ответы (1)


#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

#include <cereal/archives/json.hpp>
#include <cereal/types/vector.hpp> 
// See details in http://uscilab.github.io/cereal/stl_support.html

class MyClass {
  int x, y, z;

  class MyOtherClass {
    string name, description;

  public:
    template <class Archive>
    void serialize( Archive &archive )
    {
      archive( CEREAL_NVP( name ), CEREAL_NVP( description ) );
    }
  };

  vector<MyOtherClass> Vector;
  vector<int>          ints;

public:
  template <class Archive>
  void serialize( Archive &archive )
  {
    archive( CEREAL_NVP( x ), CEREAL_NVP( y ), CEREAL_NVP( z ), CEREAL_NVP( ints ) );
  }

  // Add one element to the private vector
  void populateVector( const int value ) {
    ints.push_back( value );
  }
};

int main()
{
  MyClass  MyObject{};

  MyObject.populateVector( 101 );
  MyObject.populateVector( 202 );
  MyObject.populateVector( 303 );

  // For brevity I just print the serialization to the standard output instead of the binary file
  cereal::JSONOutputArchive oarchive( cout );
  oarchive( MyObject );

  return 0;
}

Этот код должен выдать следующий вывод:

{
    "value0": {
        "x": 0,
        "y": 0,
        "z": 0,
        "ints": [
            101,
            202,
            303
        ]
    }
}
person Geraldo Luis da Silva Ribeiro    schedule 19.12.2020