对c++对象序列化技术的建议

Suggestion on C++ object serialization techniques

本文关键字:技术 序列化 c++ 对象      更新时间:2023-10-16

我正在创建一个c++对象序列化库。这更倾向于自我学习和增强。我不想使用现成的库,如boost或谷歌协议,但。请分享你的经验或评论的好方法去做它(如创建一些编码与标签值等)。我想从支持pod开始,然后是对非线性ds的支持。

谢谢PS: HNY2012

如果需要对进程间通信进行序列化,那么我建议使用某种接口语言(IDL或ASN.1)来定义接口。

因此,支持其他语言(比c++)也更容易。而且,它将更容易实现代码/存根生成器。

过去几个月我一直在做类似的事情。我不能使用Boost,因为任务是序列化一堆现有的类(巨大的现有代码库),并且让类从具有serialize()虚拟函数的接口继承是不合适的(我们不想要多重继承)。

所采取的方法有以下显著特点:

  1. 为每个现有类创建一个助手类,指定序列化特定类的任务,并使该助手类成为被序列化的类的友类。这避免了在被序列化的类中引入继承,并且还允许helper类访问私有变量。
  2. 让每个助手类(让我们称它们为"序列化器")将自己注册到全局映射中。每个序列化器类实现一个clone()虚函数('prototype'模式),它允许从这个映射中获取一个指向序列化器的指针,给定类的名称。名称是通过使用特定于编译器的RTTI信息获得的。注册到全局映射是通过实例化静态指针和"新建"它们来处理的,因为静态变量是在程序开始之前创建的。
  3. 创建了一个特殊的流对象(从std::fstream派生),它包含模板函数来序列化非指针、指针和STL数据类型。流对象只能以只读或只写模式打开(根据设计),因此可以使用相同的serialize()函数从文件中读取或写入文件,这取决于流打开的模式。因此,在类成员的读写顺序上没有任何不匹配的机会。
  4. 对于每个被保存或恢复的对象,根据变量的地址创建一个唯一的标签(整数)并存储在映射中。如果再次出现相同的地址,则只保存标记,而不保存深度复制对象本身。因此,每个对象只深度复制一次到文件中。

网上的一个页面捕捉了上面分享的一些想法:http://www.cs.sjsu.edu/~pearce/modules/lectures/cpp/Serialization.htm。

几年前我写过一篇文章。代码和工具可以过时,但概念可以保持不变。

也许这能帮到你。