Используя Cereal, как использовать сериализацию массива C-Style с полиморфными классами?

У меня есть простой класс здесь:

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 раз быстрее, чем цикл, и мне нужно быть быстрым здесь)

Спасибо за помощь

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector