本文以一个实例讲解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