Сериализировать Templatized Подкласс

Большое спасибо за ваше время, я действительно ценю это

Существует шаблонный подкласс, который нужно сериализовать с помощью библиотеки Cereal Serialization, базовый класс пуст, он существует только для того, чтобы мы могли иметь вектор shared_ptr для базового класса, позволяющий ему содержать несколько типов шаблонного подкласса, эффективно позволяя вектор хранение нескольких типов переменных.

class NetVar_ {};
template <class VARTYPE> class NetVar : public NetVar_
{
public:
NetVar(VARTYPE Value)
{
Var = Value;
}

template <class Archive> void serialize(Archive & archive)
{
archive(Var);
}

private:
VARTYPE Var;
};

Следующий вектор базового класса выдвигается несколькими подклассами:

std::vector<std::shared_ptr<NetVar_>> PacketData;
PacketData.push_back(std::make_shared<NetVar<int>>(32));
PacketData.push_back(std::make_shared<NetVar<int>>(32));
PacketData.push_back(std::make_shared<NetVar<std::string>>('test'));

Наконец, вектор сериализуется и отправляется на удаленную машину для обработки:

std::ostringstream SData;
{
cereal::PortableBinaryOutputArchive Archive(SData);
Archive(PacketData);
//SData is sent to remote machine here through networking library.
}

Я должен пропустить ключевую часть головоломки, потому что когда я десериализирую данные, программа выдает исключение, если я отлаживаю значения выходных переменных, либо пустые, либо большие отрицательные числа, что приводит меня к убеждению, что базовый класс или подкласс не получать сериализовано правильно.

Код был упрощен, чтобы раскрыть только проблему, для получения дополнительной информации о полной идее вы можете обратиться на этот вопрос здесь.

Следующие заголовки зерновых включены:

#include <cereal\archives\portable_binary.hpp>
#include <cereal\types\vector.hpp>
#include <cereal\types\memory.hpp>
#include <cereal\types\string.hpp>

Я уверен, что мне понадобится больше, когда я начну добавлять больше типов данных в базовый класс.

Если кто-то знает, что здесь происходит, я буду очень признателен.

Еще раз спасибо за ваше время.

0

Решение

У вас здесь нет выбора, полиморфизму нужна виртуальность, когда у вас есть доступ только к интерфейсу базового класса. это также мешает архиву быть типом шаблона.

Я полагаю, что cereal выполняет некоторое SFINAE для проверки существования метода сериализации и поведения по умолчанию, если оно не найдено. Это было бы здесь, так как у вас нет ошибки компиляции.

1

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

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