序列化模板化子类

时间:2014-04-12 19:43:30

标签: c++ templates c++11 subclass cereal

非常感谢您的时间,我非常感谢

有一个模板化的子类需要使用Cereal Serialization Library进行序列化,基类是空的,它只存在,所以我们可以有一个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.
}

我必须错过关于拼图的一个关键部分,因为当我反序列化数据时,程序抛出一个异常,如果我调试输出变量的值是空白或大的负数,这使我相信基类和/或子类未正确序列化。

代码已简化为仅公开问题,有关您可以参考的完整提示的更多信息to this question here.

包含以下谷歌标题:

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

我确信当我开始在基类中添加更多类型的数据时,我还需要更多。

如果有人知道这里发生了什么,我将非常感激。

再次感谢您的时间。

1 个答案:

答案 0 :(得分:1)

你没有这里的选择,当你只能访问基类接口时,多态性需要虚拟。它还可以防止Archive成为模板类型。

我想谷物正在做一些SFINAE来测试序列化方法的存在,并且如果没有找到则有默认行为。这是因为你没有编译错误。