Сериализация шаблонного подкласса

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

Существует шаблонный подкласс, который необходимо сериализовать с помощью библиотеки сериализации зерновых, базовый класс пуст, он существует только для того, чтобы мы могли иметь вектор 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.
}

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

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

Включены следующие жатки для зерновых:

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

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

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

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


person KKlouzal    schedule 12.04.2014    source источник
comment
Где написано: Finally, the vector is serialized and sent off to a remote machine for processing: Этот фрагмент кода, вы уверены, что это правильно? Это не выглядит правильно. Этот архив уничтожается, как только он покидает эту локальную область. Кроме того, классы не могут/не должны начинаться со знака подчеркивания.   -  person Brandon    schedule 13.04.2014
comment
Существует дополнительный код, берущий данные из std::stringstream и отправляющий их через сетевую библиотеку на удаленную машину, где они восстанавливаются. Почему он не должен начинаться с «_»? :)   -  person KKlouzal    schedule 13.04.2014
comment
Имена, начинающиеся с подчеркивания или двойного подчеркивания, зарезервированы: stackoverflow.com/questions/228783/   -  person Brandon    schedule 13.04.2014
comment
Хорошо, спасибо, это было изменено, однако это никак не повлияло на сериализацию классов. :/   -  person KKlouzal    schedule 13.04.2014


Ответы (1)


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

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

person galop1n    schedule 12.04.2014
comment
Программа знает на обоих концах, какой тип данных находится в векторе и в каком порядке, в примере мы добавляем int, int, string. На удаленной машине читает в том же порядке int, int, string. Нет ли абсолютно никакого способа сериализовать мой класс? Я уже могу нормально добавлять/получать данные, просто они не сериализуются правильно. - person KKlouzal; 13.04.2014
comment
Пользовательский код может, но общий вызов PortableBinaryOutputArchive::operator( aStdVectorOfT ) не зависит от пользовательского кода. Если вы знаете порядок, вы можете архивировать элементы один за другим вместо этого с соответствующим преобразованием типов, но подобное преобразование типов в большинстве случаев является признаком плохого дизайна. - person galop1n; 13.04.2014
comment
Плохие проекты в сторону, это должно быть сделано таким образом. Количество и типы переменных, добавленных в вектор, известны программисту, но неизвестны функции. Это позволяет программисту добавлять в вектор несколько типов нескольких переменных и отправлять их на удаленную машину для обработки. От программиста требуется читать типы переменных в том же порядке, в котором они были записаны, и ни при каких обстоятельствах он не должен пытаться читать больше переменных, чем было записано. - person KKlouzal; 13.04.2014