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