QT 序列化/串行化/對象持久化


本文以一個實例講解Qt的序列化方法:

  • Qt版本 4.8.0

Qt序列化簡介

Qt采用QDataStream來實現序列化,QT針對不同的實例化對象有不同的要求。這里主要分兩類,即:QT中原生的數據類型,例如:QString、QMap、QHash等,這對這種原生數據類型的序列化,我們不需要做其它額外的操作,直接就可以序列化到文件中;還有一類特殊的就是我們自己定義的數據結構或類,這種方式利用QDataStream不能直接實現序列化,必須重載<<和>>操作符,只有重載完之后才可以按我們的要求實現序列化。 ——引用自 [ Monkey_Online]

閑話少說直接上實例,創建一個Qt控制台應用程序:

@Freedom - qsampledata.h
#ifndef QSAMPLEDATA_H #define QSAMPLEDATA_H #include <QObject> class QSampleData : public QObject { public: QSampleData(); virtual ~QSampleData(); QSampleData& operator=(const QSampleData &other); friend QDataStream& operator>>(QDataStream&, QSampleData&); friend QDataStream& operator<<(QDataStream&, QSampleData&); //定義的數據成員 int m_nType; QString m_strName; }; #endif

 

@Freedom - qsampledata.cpp #include "qsampledata.h" #include <QDataStream> QSampleData::QSampleData() { m_nType = 0; m_strName = ""; } QSampleData::~QSampleData() { } QSampleData& QSampleData::operator =(const QSampleData& other) { m_nType = other.m_nType; m_strName = other.m_strName; return *this; } QDataStream& operator>>(QDataStream& src, QSampleData& data) { /* 錯誤:C2679: 二進制“>>”: 沒有找到接受“quint32”類型的右操作數的運算 解決方法:因為沒有添加頭文件<QDataStream> */ src >> data.m_nType ; src >> data.m_strName; return src; } QDataStream& operator<<(QDataStream& out, QSampleData& data) { out << data.m_nType << data.m_strName; return out; }

 

@Freedom - main.cpp
/*Qt Serialization Qt串行化*/ #include <QCoreApplication> #include <QFile> #include <QDataStream> #include <QTextStream> #include "ckdrawrectangle.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); //控制台輸出--將標准流封裝為QTextStream對象 QTextStream cin(stdin, QIODevice::ReadOnly); QTextStream cout(stdout, QIODevice::WriteOnly); QTextStream cerr(stderr, QIODevice::WriteOnly); ////////////////////////////////////////////////////// QSampleData data; data.m_nType = 12; data.m_strName = "vic.MINg"; QFile file("file.dat"); //寫入 file.open(QIODevice::WriteOnly); QDataStream out(&file); out << data; file.close(); //讀取 QSampleData readData; file.open(QIODevice::ReadOnly); QDataStream in(&file); in >> readData; file.close(); ////////////////////////////////////////////////////// cout << data.m_nType<<endl; cout << data.m_strName; cout.flush(); return a.exec(); }

更新

-*2015-11-09 第一次更新

 

http://blog.csdn.net/qq2399431200/article/details/49741715


免責聲明!

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



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