1

序列化与反序列化

序列化基础知识

  • 程序运行过程中产生的一些对象需要被保存下来(对象在程序结束后对象将会被清除,所以在有必要的时候需要主动将其保存下来)以便于后面的使用(如果将对象直接随意保存在磁盘中,下次读取时程序无法有效解析所读取的内容),或者对象需要通过网络传输到另一台机器上时(如果直接传输对象,对端接受到数据后也无法有效解析所接受到的数据,无法达到网络传输的目的),一般都需要进行序列化、反序列化。其实将对象转化为txt文件(当然每行内容代表什么意思需要知道),然后从txt文件读取内容并创建成对象,也算一种序列化、反序列化策略,只是这种策略较为低效。故需要设计更加高效的序列化、反序列化方式。
  • 序列化:将对象转化为字节流。最终得到的字节流即包括了数据,也有一些元数据或者标记等以便于后面能被反序列成一个对象(包括对象结构和数据)。那么如何进行序列化需要被良好设计以能更高效、更便捷地序列化对象。
  • 反序列化:序列化的反过程,即将知道如何进行序列化的字节流转化为相应的对象,怎么转化是借助与字节流中的元数据或者某些标志实现的。
  • 序列化与反序列化类似一种协议,这种协议规定了如何将一个对象转化成一个字节流,因为字节流可以有效地存储并发送。但是需要知道字节流的含义才有意义,而这个协议就规定了字节流的含义以及如何得到、使用这样的字节流。

c++常见的序列化方式

  • 目前有多种序列化方式,有些序列化方法被广泛使用并得到好评。一个良好的序列化具有高效、便捷、使用范围较广等。
  • Json序列化:借助与Json实现序列化与反序列化。即将对象序列化为json,反序列化时通过该json字符串还原成对象。目前也有一些库可以支持将C++对象转化为json和由json转化成对应的对象。如RapidJSON、jsoncpp等。
  • XML序列化:同json序列化一样,借助于XML格式实现序列化和反序列化。支持此功能的库有TinyXML、pugixml等。
  • Protocol Buffers(protobuf):该序列化格式由google开发。该格式使用.proto文件定义数据结构,并提供了序列化与反序列化该种文件的方法。使用protobuf需要安装protobuf。
  • Boost库序列化:Boost是C++标准库,该库提供了多种功能,其中就包括了序列化和反序列化功能,但是使用时需要安装整个Boost,如果仅仅使用序列化功能就安装整个库可能代价较大。但是如果会使用Boost的其它功能时,这种选择较为合理。
  • 自定义序列化:可以自己定义序列化过程以及反序列化过程。但是需要较高的综合素质,要考虑序列化的效率,可使用性,便捷性等。

QT序列化

  • QT有一个QDataStream类,该类可以实现QT的序列化和反序列化。对于c++的基础类型、Qt的基础类型,可以使用“<<”或者“>>”直接输入输出到QDataStream对象中去,其序列化与反序列化过程已经被该类型封装好了。当自定义类需要使用QDataStream进行序列化和反序列化时需要重载“<<”或者“>>”,在符号重载函数中将某些类型转化为基础类型,再输入输出。

xianghanfeng
6 声望1 粉丝