序列化模板化的子类

Serialize Templatized Sub Class

本文关键字:子类 序列化      更新时间:2023-10-16

非常感谢您抽出时间我真的很感激

有一个模板化的子类需要用谷物序列化库进行序列化,基类是空的,它的存在只是为了让我们可以在基类中有一个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 <cerealarchivesportable_binary.hpp>
#include <cerealtypesvector.hpp>
#include <cerealtypesmemory.hpp>
#include <cerealtypesstring.hpp>

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

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

再次感谢您抽出时间。

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

我想grain正在做一些SFINAE来测试serialize方法的存在,如果没有找到,就会有一个默认行为。这里的情况就是这样,因为您没有编译错误。