У меня есть простой класс здесь:
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
{
[...]
}
И, когда я хочу зарегистрировать свой класс clDaughter, используя CEREAL_REGISTER_TYPE(...)
макро,
CEREAL_REGISTER_TYPE(clDaugter_A<int>)
CEREAL_REGISTER_TYPE(clDaugter_B<int>)
компилятор падает с
«cereal не смог найти никаких выходных функций сериализации для предоставленной комбинации типа и архива»
Похоже, проблема в этом binary_data(...)
метод, потому что если я сериализую __pData
массив в цикле (уродливый стиль)
for (u16Idx = 0;..;..)
{
ar(this->__pData[u16Idx];
}
У меня нет ошибки, и она отлично работает. Это только когда я использую binary_data()
а также CEREAL_REGISTER_TYPE()
все вместе.
Что я упустил ?
(чтобы упредить вопрос, я хочу использовать binary_data()
потому что это примерно в 20-30 раз быстрее, чем цикл, и мне нужно быть быстрым здесь)
Спасибо за помощь
Задача ещё не решена.
Других решений пока нет …