我在这里有一个简单的分析:
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倍,我需要在这里快速行进。
感谢您的帮助