0

非常感谢您的宝贵时间我真的很感激

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

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

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

再次感谢您的宝贵时间。

4

1 回答 1

1

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

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

于 2014-04-12T20:02:34.713 回答