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()<<"\t"<<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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM