序列化模板化的子类
Serialize Templatized Sub Class
非常感谢您抽出时间我真的很感激
有一个模板化的子类需要用谷物序列化库进行序列化,基类是空的,它的存在只是为了让我们可以在基类中有一个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方法的存在,如果没有找到,就会有一个默认行为。这里的情况就是这样,因为您没有编译错误。
相关文章:
- 如何初始化矢量的模板化子类
- 如何检查模板专用化是否是基本模板的子类?
- 我的子类的属性是延迟初始化的
- 初始化依赖于子类的继承类的常量类成员
- 我可以通过将类强制转换为 char* 来序列化类吗?
- 无法将模板子类强制转换为其他模板实例化
- 提升 - 类没有名为"序列化"的成员(抽象类)?
- 子类化标准::时间::d
- C++通过基类指针提升子类的序列化
- 类序列化方法
- 事件类序列化
- 提升最终子类错误的基类的序列化
- Boost序列化子类
- 用自己的类序列化QHash
- C++子类模块化函数
- 在Boost (c++)中没有类跟踪的派生类序列化
- 增强类序列化,更改成员类型
- 用户定义的类序列化、C++和msgpack
- 序列化模板化的子类
- 代码综合- c++ /树子节点序列化