Сериализация Templatized Sub Class
Вопрос
Большое спасибо за ваше время, я действительно ценю это
Существует множественный подкласс, который должен быть сериализован с библиотекой сериализации зерновых, базовый класс пустой, он только существует, поэтому мы можем иметь вектор 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>
.
Я уверен, что мне нужно больше, когда я начинаю добавлять больше типов данных в базовый класс.
Если у кого-то есть идеи, что происходит здесь, я бы очень признателен.
Спасибо снова за ваше время.
Решение
У вас нет выбора здесь, полиморфизм нуждается в виртуальности, когда у вас есть только доступ к интерфейсу базового класса.Предотвращает также архивирующую тип шаблона.
Я представляю, что хлопья делает несколько Sfinae, чтобы проверить существование метода сериализации и иметь поведение по умолчанию, если не найдено.Это было бы так, как у вас нет ошибки компиляции.