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