1

我正在使用 SFML 和谷物来序列化/反序列化数据,我想为sf::vector2sf::vector3类这样做:

数据.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);
  }
};

主文件

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.

任何想法?

谢谢。

4

1 回答 1

0

我无法验证它是否有效,我想您需要手动添加 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);
    }
}

它们不是多态类型,所以你不需要注册任何东西。

- 编辑 -

在sf命名空间下添加函数。

于 2017-04-08T17:28:41.310 回答