对c++对象序列化技术的建议
Suggestion on C++ object serialization techniques
我正在创建一个c++对象序列化库。这更倾向于自我学习和增强。我不想使用现成的库,如boost或谷歌协议,但。请分享你的经验或评论的好方法去做它(如创建一些编码与标签值等)。我想从支持pod开始,然后是对非线性ds的支持。
谢谢PS: HNY2012
如果需要对进程间通信进行序列化,那么我建议使用某种接口语言(IDL或ASN.1)来定义接口。
因此,支持其他语言(比c++)也更容易。而且,它将更容易实现代码/存根生成器。
过去几个月我一直在做类似的事情。我不能使用Boost,因为任务是序列化一堆现有的类(巨大的现有代码库),并且让类从具有serialize()虚拟函数的接口继承是不合适的(我们不想要多重继承)。
所采取的方法有以下显著特点:
- 为每个现有类创建一个助手类,指定序列化特定类的任务,并使该助手类成为被序列化的类的友类。这避免了在被序列化的类中引入继承,并且还允许helper类访问私有变量。
- 让每个助手类(让我们称它们为"序列化器")将自己注册到全局映射中。每个序列化器类实现一个clone()虚函数('prototype'模式),它允许从这个映射中获取一个指向序列化器的指针,给定类的名称。名称是通过使用特定于编译器的RTTI信息获得的。注册到全局映射是通过实例化静态指针和"新建"它们来处理的,因为静态变量是在程序开始之前创建的。
- 创建了一个特殊的流对象(从
std::fstream
派生),它包含模板函数来序列化非指针、指针和STL数据类型。流对象只能以只读或只写模式打开(根据设计),因此可以使用相同的serialize()函数从文件中读取或写入文件,这取决于流打开的模式。因此,在类成员的读写顺序上没有任何不匹配的机会。 - 对于每个被保存或恢复的对象,根据变量的地址创建一个唯一的标签(整数)并存储在映射中。如果再次出现相同的地址,则只保存标记,而不保存深度复制对象本身。因此,每个对象只深度复制一次到文件中。
网上的一个页面捕捉了上面分享的一些想法:http://www.cs.sjsu.edu/~pearce/modules/lectures/cpp/Serialization.htm。
几年前我写过一篇文章。代码和工具可以过时,但概念可以保持不变。
也许这能帮到你。
相关文章:
- 如何在C++中序列化结构数据
- 序列化,没有库的整数,得到奇怪的结果
- 如何知道QDataStream不能反序列化某些内容
- 如何使用Python从C++中读取谷物序列化数据
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 自定义对象的dlib序列化在gcc中失败
- C++boost序列化多态性问题
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 在 cpp 中的平面缓冲区中序列化对象
- 每次进行继承时都需要提升::序列化::base_object吗?
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 提升序列化 1:73 的向后兼容性问题
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 如何反序列化数组?
- 如何使用提升序列化?
- 序列化多晶型接口
- 对c++对象序列化技术的建议