我正在尝试学习如何序列化C ++对象。
在这里阅读了几篇文章之后,使用boost
序列化函数和使用加载/保存功能进行归档似乎是一个好主意。但是,我想避免使用boost库。
从概念上讲,我可以在不知道其字段的情况下保存对象。在C ++中没有反射,存储对象的唯一方法是知道它的所有类成员。
可以使用stringstream
并重载<<
运算符以将对象转换为字符串,我可以直接保存对象。
谢谢,K。
答案 0 :(得分:1)
从概念上讲,我可以在不知道其字段的情况下保存对象。
不,你不能。
在C ++中没有反射,存储对象的唯一方法是知道所有类成员。
是。最好的方法是将这些知识封装在该类中:
class MyClass {
public:
std::ostream& put(std::ostream& os) const {
os << field1 << " " << field2 << std::endl;
return os;
}
friend std::ostream& operator<<(std::ostream& os, const MyClass& myclass) {
return myClass.put(os);
}
private:
int field1;
double field2;
};
答案 1 :(得分:0)
您可以遵循的方法是默认支持元组和迭代。
有一个read_archive和write_archive,它首先可以检测支持for(:)
循环的类型,以及类似于元组的类型,因为它们支持std::tuple_size
和ADL get<I>
。< / p>
这也与C ++ 17中的一种结构化绑定支持形式对齐。
接下来,启用基于to_tie
sfinae adl启用的实施,检查to_tie()
和to_tie(.)
。如果是这样并且可读/可写,则使用它。
也许在某处包含了archive_io
函数的adl查找,因此您可以明确地编写自己的io。
我们的目标是尽可能地自动存档,以及您无法轻松构建的内容。