Сериализовать / десериализовать класс векторов SFML с использованием хлопьев

Я использую SFML и хлопья для сериализации / десериализации данных, и я хочу сделать это для классов sf::vector2 и sf::vector3:

Data.h

#include <SFML\System.hpp>
#include <fstream>
#include <iostream>
#include "cereal-1.2.2\include\cereal\archives\xml.hpp"
#include "cereal-1.2.2\include\cereal\types\map.hpp"

struct DataInfo {
  map<string, sf::Vector2f> vector2FloatData;
  map<string, sf::Vector3f> vector3FloatData;
  map<string, sf::Vector2i> vector2IntData;
  map<string, sf::Vector3i> vector3IntData;

  template <class Archive>
  void serialize(Archive & ar)
  {
     ar(vector2FloatData, vector3FloatData, vector2IntData, vector3IntData);
  }
};

main.cpp

int Main()
{
   std::ofstream file("Test.xml");
   cereal::XMLOutputArchive archive(file);

   DataInfo data;
   archive(data);

   return 0;
}

Но хлопья не знают, что такое sf::vectors, и я получаю следующую ошибку:

Error C2338 cereal could not find any output serialization functions for the provided type and archive combination.

Я знаю, что они существуют CEREAL_REGISTER_TYPE(), но не знаю, как заставить их работать.

Добавление в Data.h:

#include "cereal-1.2.2\include\cereal\types\polymorphic.hpp"

CEREAL_REGISTER_TYPE(sf::Vector2f)
CEREAL_REGISTER_TYPE(sf::Vector3f)
CEREAL_REGISTER_TYPE(sf::Vector2i)
CEREAL_REGISTER_TYPE(sf::Vector3i)

Я получаю такую ​​ошибку:

Error C2338 Attempting to register non polymorphic type.

Любая идея?

Спасибо.


person Tino Martin    schedule 08.04.2017    source источник


Ответы (1)


Я не могу проверить, работает ли это, я думаю, вам нужно добавить сериализацию для типов sfml вручную, например:

namespace /*cereal*/ sf
{
    template<class Archive>
    void serialize(Archive & archive, sf::Vector2i & v)
    {
         archive( v.x, v.y);
    }
}

Снова не уверен, но он может работать и с шаблонными типами:

namespace /*cereal*/ sf
{
    template<class Archive, class Type>
    void serialize(Archive & archive, sf::Vector2<Type> & v)
    {
         archive( v.x, v.y);
    }
}

Они не являются полиморфными типами, поэтому регистрировать ничего не нужно.

--EDIT--

Добавьте функцию в пространство имен sf.

person seleciii44    schedule 08.04.2017
comment
Да, вам понадобится что-то подобное, поскольку Cereal не знает, как обрабатывать типы SFML из коробки. - person Mario; 08.04.2017
comment
Пытался, но по-прежнему получаю ошибку: Ошибка C2338 cereal не удалось найти никаких функций сериализации вывода для указанной комбинации типа и архива. - person Tino Martin; 09.04.2017
comment
сначала попробуйте внешнюю функцию сериализации с простым классом. затем добавьте пространство имен в свой класс и повторите попытку. наконец, сделайте его шаблоном, например sf :: vector, и попробуйте еще раз. Я уверен, что найду проблему. Также перед функцией сериализации необходимо включить зерно. - person seleciii44; 09.04.2017