使用Cereal,如何使用带有多态类的C-Style数组序列化?

时间:2015-11-25 14:35:29

标签: c++ arrays serialization polymorphism cereal

我在这里有一个简单的分析:

template <typename T>
class clDaughter
{
public:

  T*        __pData;
  uint16_t  __u16Size;

  clDaughter() [...]

  ~clDaughter() [...]

  clDaughter(uint16_t const ku16Size)
  {
    this->__pData = (T*)malloc(ku16Size * sizeof(T));
    this->__u16Size = ku16Size;
  }

  template<class Archive>
  void save(Archive & ar) const
  {
    ar(this->__u16Size);
    ar(cereal::binary_data(this->__pData, this->__u16Size * sizeof(T)));
  }

  template<class Archive>
  void load(Archive & ar)
  {
    uint16_t u16LoadedSize;
    ar(u16LoadedSize);

    this->__pData = (T*)malloc(u16LoadedSize * sizeof(T));
    this->__u16Size = u16LoadedSize;
    ar(cereal::binary_data(this->__pData, this->__u16Size * sizeof(T)));
  }
};

这个工作正常,我的意思是,序列化输入和输出都经过测试。

当我想在这里使用多态时,麻烦就开始了。这个女儿班继承了一个纯粹的虚拟母亲班,以及其他类似“女儿”的班级。类。

class clDaugter_A : public clMother
{
  [...]
}
class clDaugter_B : public clMother
{
  [...]
}

而且,当我想使用CEREAL_REGISTER_TYPE(...)宏注册我的clDaughter类时,

CEREAL_REGISTER_TYPE(clDaugter_A<int>)   
CEREAL_REGISTER_TYPE(clDaugter_B<int>)

编译器崩溃

&#34;谷物找不到所提供类型和档案组合的任何输出序列化功能&#34;

问题似乎来自这个binary_data(...)方法,因为如果我在循环中序列化__pData数组(丑陋风格)

for (u16Idx = 0;..;..)
{
  ar(this->__pData[u16Idx];
}

我没有错误,它运行正常。只有当我一起使用binary_data()CEREAL_REGISTER_TYPE()时才会这样做。

我错过了什么?

(为了预先解决这个问题,我确实想使用binary_data(),因为它比循环快了20-30倍,我需要在这里快速行进。

感谢您的帮助

0 个答案:

没有答案