文章目录
定义
Qt中序列化与反序列化
序列化:
反序列化:
自定义数据结构序列化与反序列化
项目结构
数据结构信息
执行效果
项目源码
开发环境
定义
序列化:将对象或数据结构转换为二进制序列
反序列化:二进制序列转换为对象或数据结构
使对象或数据结构更方便地在网络上传输或者保存在本地文件中。
本文展示通过序列化将自定义数据结构序列化到硬盘文件中,再从文件反序列出来还原数据信息。
Qt中序列化与反序列化
Qt中使用QDataStream类实现对象序列化;
序列化:
QFile file("file.rx"); //定义文件路径
file.open(QIODevice::WriteOnly); //以只写模式打开
QDataStream out(&file); //定义数据流
out << QString("hello world!"); //写入内容
反序列化:
QFile file("datas.rx"); //定义文件路径
file.open(QIODevice::ReadOnly); //以只读模式打开
QDataStream in(&file); //定义数据流
QString str; //创建字符串用于接收
in >> str; //读出内容
自定义数据结构序列化与反序列化
QDataStream只能序列化基本类型,对于自定义类或者数据结构则需要在自定义类中声明并实现友元函数friend:
friend QDataStream &operator<<(QDataStream &stream, const ParamsData &data); //序列化
friend QDataStream &operator>>(QDataStream &stream, ParamsData &data); //反序列胡
QDataStream本身支持的数据类型如下:
bool
qint8
qint16
qint32
qint64
quint8
quint16
quint32
quint64
float
double
const char *
QBitArray
QBrush
QByteArray
QColor
QCursor
QDate
QDateTime
QEasingCurve
QFont
QGenericMatrix
QHash<Key, T>
QIcon
QImage
QKeySequence
QLinkedList<T>
QList<T>
QMap<Key, T>
QMargins
QMatrix4x4
QPair<T1, T2>
QPalette
QPen
QPicture
QPixmap
QPoint
QQuaternion
QRect
QRegExp
QRegularExpression
QRegion
QSize
QString
QTime
QTransform
QUrl
QVariant
QVector2D
QVector3D
QVector4D
QVector<T>
原文地址:https://doc.qt.io/qt-5/datastreamformat.html
项目结构
CommonData类:公共类,用于存储数据;方便项目中其他类文件调用,数据使用静态存储;
MainWindow类:使用CommonData中静态数据,包含UI界面,实现数据的序列化与反序列化;
数据结构信息
根据以上描述,定义如下数据struct,并声明实现friend友元函数:
注意:读和写的变量顺序必须一致
//定义静态数据结构
static struct ParamsData{QString m_paramFile="qwe";int m_imagenubth=-1;bool m_SysInitDone=false;int m_grabimgIdx=112;float m_axisNum=123.234f;bool m_homeState=true;QPoint mark1_Center=QPoint(23,23);double mark1_Radius=5.0008;friend QDataStream &operator<<(QDataStream &stream, const ParamsData &data)//序列化{stream << data.m_paramFile;stream << data.m_imagenubth;stream << data.m_SysInitDone;stream << data.m_grabimgIdx;stream << data.m_axisNum;stream << data.m_homeState;stream << data.mark1_Center;stream << data.mark1_Radius;return stream;}friend QDataStream &operator>>(QDataStream &stream, ParamsData &data)//反序列化{stream >> data.m_paramFile;stream >> data.m_imagenubth;stream >> data.m_SysInitDone;stream >> data.m_grabimgIdx;stream >> data.m_axisNum;stream >> data.m_homeState;stream >> data.mark1_Center;stream >> data.mark1_Radius;return stream;}
}paramsData;
界面如下:
CommonData.h
#ifndef COMMONDATA_H
#define COMMONDATA_H#include <QObject>
#include <QDataStream>//用于存储公共数据
class CommonData : public QObject
{Q_OBJECT
public:explicit CommonData(QObject *parent = nullptr);public://定义静态数据结构static struct ParamsData{QString m_paramFile="qwe";int m_imagenubth=-1;bool m_SysInitDone=false;int m_grabimgIdx=112;float m_axisNum=123.234f;bool m_homeState=true;QPoint mark1_Center=QPoint(23,23);double mark1_Radius=5.0008;friend QDataStream &operator<<(QDataStream &stream, const ParamsData &data)//序列化{stream << data.m_paramFile;stream << data.m_imagenubth;stream << data.m_SysInitDone;stream << data.m_grabimgIdx;stream << data.m_axisNum;stream << data.m_homeState;stream << data.mark1_Center;stream << data.mark1_Radius;return stream;}friend QDataStream &operator>>(QDataStream &stream, ParamsData &data)//反序列化{stream >> data.m_paramFile;stream >> data.m_imagenubth;stream >> data.m_SysInitDone;stream >> data.m_grabimgIdx;stream >> data.m_axisNum;stream >> data.m_homeState;stream >> data.mark1_Center;stream >> data.mark1_Radius;return stream;}}paramsData;};#endif // COMMONDATA_H
CommonData.cpp
#include "commondata.h"CommonData::CommonData(QObject *parent) : QObject(parent)
{}CommonData::ParamsData CommonData::paramsData;//此句需要,否则报错
MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void PrintContent();private slots:void on_btn_Read_clicked();void on_btn_Write_clicked();void on_btn_ChangeVal_clicked();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "commondata.h"
#include <QFile>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_btn_Read_clicked()// 从文件中读取/初始化数据
{QFile file("data.sx");//文件在程序运行目录下if(file.exists())//如果文件存在 则从文件读取数据{file.open(QIODevice::ReadOnly);QDataStream input(&file);input >> CommonData::paramsData;file.close();//打印出各个变量的值qDebug() << QStringLiteral("打印出文件中读出的值.......");PrintContent();}else//如果文件不存在 则使用初始化数据{//打印出各个变量的值qDebug() << QStringLiteral("打印出初始化的值.......");PrintContent();}
}void MainWindow::on_btn_Write_clicked()//将数据写入文件保存
{QFile file("data.sx");//文件在程序运行目录下file.open(QIODevice::WriteOnly);QDataStream output(&file);output << CommonData::paramsData;file.close();
}void MainWindow::on_btn_ChangeVal_clicked()//改变数据的值,查看是否能正确写入文件并读出
{CommonData::paramsData.m_axisNum=234.123f;CommonData::paramsData.m_homeState=false;CommonData::paramsData.m_paramFile="wer";CommonData::paramsData.m_grabimgIdx=113;CommonData::paramsData.m_imagenubth=168;CommonData::paramsData.mark1_Center=QPoint(66,88);CommonData::paramsData.mark1_Radius=6.08080808;CommonData::paramsData.m_SysInitDone=true;qDebug() << QStringLiteral("打印改变后的值.......");PrintContent();
}void MainWindow::PrintContent()//打印数据 便于调试查看
{qDebug() << CommonData::paramsData.m_axisNum;qDebug() << CommonData::paramsData.m_homeState;qDebug() << CommonData::paramsData.m_paramFile;qDebug() << CommonData::paramsData.m_grabimgIdx;qDebug() << CommonData::paramsData.m_imagenubth;qDebug() << CommonData::paramsData.mark1_Center;qDebug() << CommonData::paramsData.mark1_Radius;qDebug() << CommonData::paramsData.m_SysInitDone;
}
执行效果
/*执行步骤:1、没有文件,初始化数据结构2、改变数据结构的值3、写入文件4、读取文件,读出的为更改后的值
*/
"打印出初始化的值......."
123.234
true
"qwe"
112
-1
QPoint(23,23)
5.0008
false
"打印改变后的值......."
234.123
false
"wer"
113
168
QPoint(66,88)
6.08081
true
"打印出文件中读出的值......."
234.123
false
"wer"
113
168
QPoint(66,88)
6.08081
true
项目源码
GitHub地址:lizhifun/QtSerialize
开发环境
Author:Lizhifun
OS:Windows 10 家庭中文版
Compiler:Microsoft Visual C++ Compiler 15.9.28307.1259(amd64)
Kit:Desktop Qt 5.14.2 MSVC2017 64bit
Qt Creator:4.11.1