关于C ++对象序列化技术的建议

时间:2012-01-02 07:55:56

标签: c++ serialization

我正在创建一个C ++对象序列化库。这更倾向于自学和增强。我不想使用像boost或google protocol buf这样的现成库。 请分享您的经验或评论的好方法(比如使用标签值创建一些编码等)。 我想首先支持POD,然后支持非线性DS。

由于 PS:HNY2012

3 个答案:

答案 0 :(得分:1)

如果您需要序列化进程间进程通信,那么我建议使用一些接口语言(IDLASN.1)来定义接口。

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

答案 1 :(得分:1)

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

采取的方法具有以下显着特征:

  1. 为每个现有类创建一个辅助类,使用序列化该特定类的任务指定,并使辅助类成为要序列化的类的朋友。这样可以避免在被序列化的类中引入继承,并且还允许帮助程序类访问私有变量。
  2. 让每个帮助程序类(让我们称之为“序列化程序”)将自己注册到全局映射中。每个序列化程序类都实现了一个clone()虚函数('prototype'模式),它允许从这个映射中给出类的名称来检索指向序列化程序的指针。该名称是使用特定于编译器的RTTI信息获得的。注册到全局映射是通过实例化静态指针和'新'来完成的,因为静态变量是在程序启动之前创建的。
  3. 创建了一个特殊的流对象(派生自std::fstream),其中包含用于序列化非指针,指针和STL数据类型的模板函数。流对象只能以只读或只写模式打开(按设计),因此可以使用相同的serialize()函数从文件读取或写入文件,具体取决于模式。溪流被打开了。因此,阅读与写作班级成员的顺序不存在任何不匹配的可能性。
  4. 对于保存或恢复的每个对象,基于变量的地址创建唯一标记(整数)并存储在地图中。如果再次出现相同的地址,则仅保存标记,而不保存深度复制的对象本身。因此,每个对象只被深度复制一次到文件中。
  5. 网页上的一个页面捕获了上面分享的一些想法:http://www.cs.sjsu.edu/~pearce/modules/lectures/cpp/Serialization.htm。希望有所帮助。

答案 2 :(得分:0)

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

可能this可以帮助您。