Qt串行化的输入和输出(使用QDataStream读写QByteArray,对QIODevice直接起作用)

参考https://lug.ustc.edu.cn/sites/qtguide/

今天看了一个介绍Qt串行化的介绍,感觉很受益,就记录了下来。

串行化(Serialization)是计算机科学中的一个概念,它是指将对象存储到介质(如文件、内存缓冲区等)中或是以二进制方式通过网络传输。之后可以通过反串行化从这些连续的字节(byte)数据重新构建一个与原始对象状态相同的对象,因此在特定情况下也可以说是得到一个副本,但并不是所有情况都这样。
Qt 对这类组合数据的打包方法就叫串行化(Serializing),在 Qt 帮助文档的索引里输入关键词 Serializing 就可以看到关于 Qt 串行化的帮助主题(Serializing Qt Data Types),除了 C++ 基本数值类型,Qt 还对大量自身的类对象做了串行化。串行化得到一个字节数组 QByteArray ,可以直接用于发送。Qt 串行化数据接收就是发送的逆过程,都是通过 QDataStream 流实现。

下面是一个简单的实现
[cpp] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. //qtcodec.cpp  
  2. #include <QDebug>  
  3. #include <iostream>  
  4. #include <QByteArray>  
  5. #include <QDataStream>  
  6.   
  7. using namespace std;  
  8.   
  9. QByteArray TestSerialOut()  
  10. {  
  11.     //数据  
  12.     int nVersion = 1;  
  13.     double dblValue = 125.78999;  
  14.     QString strName = QObject::tr("This an example.");  
  15.     //字节数组保存结果  
  16.     QByteArray baResult;  
  17.     //串行化的流  
  18.     QDataStream dsOut(&baResult, QIODevice::ReadWrite);  //做输出,构造函数用指针  
  19.     //设置Qt串行化版本  
  20.     dsOut.setVersion(QDataStream::Qt_5_0);//使用Qt 5.0 版本流  
  21.     //串行化输出  
  22.     dsOut<<nVersion<<dblValue<<strName;  
  23.   
  24.     //显示长度  
  25.     qDebug()<<baResult.length()<<" "<<qstrlen(baResult.data());  
  26.     //返回对象  
  27.     return baResult;  
  28. }  
  29.   
  30. void TestSerialIn(const QByteArray& baIn)  
  31. {  
  32.     //输入流  
  33.     QDataStream dsIn(baIn); //只读的流,构造函数用常量引用  
  34.     //设置Qt串行化版本  
  35.     dsIn.setVersion(QDataStream::Qt_5_0);//使用Qt 5.0 版本流  
  36.     //变量  
  37.     int nVersion;  
  38.     double dblValue;  
  39.     QString strName;  
  40.     //串行化输入  
  41.     dsIn>>nVersion>>dblValue>>strName;  
  42.   
  43.     //打印  
  44.     qDebug()<<nVersion;  
  45.     qDebug()<<fixed<<dblValue;  
  46.     qDebug()<<strName;  
  47. }  
  48.   
  49. int main()  
  50. {  
  51.     QByteArray ba = TestSerialOut();  
  52.   
  53.     TestSerialIn(ba);  
  54.     return 0;  
  55. }   

http://blog.csdn.net/guoqianqian5812/article/details/50810154

原文地址:https://www.cnblogs.com/findumars/p/6375845.html