序列化C ++对象而不知道其字段

时间:2016-08-02 00:23:22

标签: c++ serialization

我正在尝试学习如何序列化C ++对象。 在这里阅读了几篇文章之后,使用boost序列化函数和使用加载/保存功能进行归档似乎是一个好主意。但是,我想避免使用boost库。

从概念上讲,我可以在不知道其字段的情况下保存对象。在C ++中没有反射,存储对象的唯一方法是知道它的所有类成员。

可以使用stringstream并重载<<运算符以将对象转换为字符串,我可以直接保存对象。

谢谢,K。

2 个答案:

答案 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。

我们的目标是尽可能地自动存档,以及您无法轻松构建的内容。