如何在使用Boost序列化时删除此重复代码
How can I remove this duplicate code when using Boost serialization?
在我的应用程序中,我有许多类希望能够序列化。因此,每个实例需要序列化的类都有以下内容:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, const unsigned int version)
{
// ar & (all data members)
}
为了序列化对象,我需要使用类外的以下代码:
ObjectToSerialize obj;
stringstream ss;
boost::archive::text_oarchive oa(ss);
oa << obj;
这第二块代码让我很烦恼,因为每次我想序列化对象时都必须使用它。有没有什么方法可以将这些代码移动到一个位置,并在需要序列化对象时调用它?
我可以用这种方法得到一个对象:
string serializeObject(Serializable obj)
但问题是,没有办法确定哪些对象是"可序列化的",因为在添加boost序列化功能时,类没有必须实现的超类型。
那么,我如何将这些代码放在一个地方,只允许将可序列化的对象传递给该方法呢?
生成一个模板函数,该函数接受具有序列化函数的对象。
template <typename T> std::string serializeObject(T obj) {
stringstream ss;
boost::archive::text_oarchive oa(ss);
oa << obj;
//...
}
std:String str = serializeObject(ObjectToSerialize);
这很简单:您不想要也不需要这些对象的基类。因此,使用静态多态性代替动态多态性:
template <class Serializable>
std::string serializeObject(Serializable& s)
{
stringstream ss;
boost::archive::text_oarchive oa(ss);
oa << obj;
return ss.str();
}
现在,如果将不可序列化的内容传递给函数,则会出现编译器错误。为了使错误更具可读性,您可以尝试使用一些基于SFINAE的技术,如std::enable_if
相关文章:
- 为什么示例代码访问IUnknown中已删除的内存
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 是否可以使用 C++ 中的模板减小删除代码大小
- 删除C++继承中虚拟类成员的代码重复
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 删除继承中的代码重复?
- 从排序数组中删除重复项,具有不同代码方式的相同解决方案具有不同的输出
- G++ 发出警告,要求删除一个代码的数组,但不删除另一个代码的数组
- 删除原子多线程代码中的容器
- 使用 ostream 变量删除代码重复
- 可视代码 删除函数括号内的空格
- Qt创建者-如何删除Clang代码模型
- 有没有一种预处理器的方法可以从调试符号中删除代码段
- 为什么在const和非const方法中删除代码重复不是不确定的行为
- While 循环 - 如何删除代码重复
- enable_if如何用于删除代码
- 是否可以使用十六进制编辑器从exe文件中删除代码?(c++)
- 为什么第一个值是2814,而不是在我删除代码块之后
- 使用-O3或-Ofast编译基准代码现实吗?还是会删除代码