使用的是QDataStream进行文件数据流的存储
QT自带的QDataStream只能传递它自己要求的数据类型。但是我们可以自己重载QDataStream& operator<<()和QDataStream& operator>>();这样我们就可以传递struct的类型了
串行化(Serialization)是计算机科学中的一个概念,它是指将对象存储到介质(如文件、内存缓冲区等)中或是以二进制方式通过网络传输。之后可以通过反串行化从这些连续的字节(byte)数据重新构建一个与原始对象状态相同的对象,因此在特定情况下也可以说是得到一个副本,但并不是所有情况都这样。
Qt 对这类组合数据的打包方法就叫串行化(Serializing),在 Qt 帮助文档的索引里输入关键词 Serializing 就可以看到关于 Qt 串行化的帮助主题(Serializing Qt Data Types),除了 C++ 基本数值类型,Qt 还对大量自身的类对象做了串行化。串行化得到一个字节数组 QByteArray ,可以直接用于发送。Qt 串行化数据接收就是发送的逆过程,都是通过 QDataStream 流实现。
1、首先新建一个类,存储三个不同类型的字段信息;
class T
{
public:
int a;
double b;
QString c;
T(int a1, double b1, QString c1);
friend QDataStream& operator<<(QDataStream &out, const T &t);
friend QDataStream& operator>>(QDataStream &in, T &t);
};
T::T(int a1, double b1, QString c1)
{
a = a1;
b = b1;
c = c1;
}
2、分别重写文件读写操作
QDataStream& operator <<(QDataStream &out, const T &t)
{
out << t.a << t.b << t.c;
return out;
}
QDataStream& operator >>(QDataStream &in, T &t)
{
int a;
double b;
QString c;
in >> a >> b >> c;
t.a = a;
t.b = b;
t.c = c;
return in;
}
3、分别在main函数进行相对应的文件操作即可
//文件写入
T t(1, 2, "3");
QFile writeFile("test.dat");
writeFile.open(QIODevice::WriteOnly);
QDataStream out(&writeFile);
out << t;
writeFile.close();
//文件读取
QFile readFile("test.dat");
readFile.open(QIODevice::ReadOnly);
QDataStream in(&readFile);
in >> t;
readFile.close();
qDebug() << t.a << t.b << t.c;
注意最开始的引用:
#include <QApplication>
#include <QtCore/QCoreApplication>
#include <QFile>
#include <QByteArray>
#include <QDebug>
字符串写入 串行化的示例
#include <QCoreApplication>
//qtcodec.cpp
#include <QDebug>
#include <iostream>
#include <QByteArray>
#include <QDataStream>
using namespace std;
QByteArray TestSerialOut()
{
//数据
int nVersion = 1;
double dblValue = 125.78999;
QString strName = QObject::tr("This an example.");
//字节数组保存结果
QByteArray baResult;
//串行化的流
QDataStream dsOut(&baResult, QIODevice::ReadWrite); //做输出,构造函数用指针
//设置Qt串行化版本
dsOut.setVersion(QDataStream::Qt_5_0);//使用Qt 5.0 版本流
//串行化输出
dsOut<<nVersion<<dblValue<<strName;
// //显示长度
// qDebug()<<baResult.length()<<"\t"<<qstrlen(baResult.data());
//返回对象
return baResult;
}
void TestSerialIn(const QByteArray& baIn)
{
//输入流
QDataStream dsIn(baIn); //只读的流,构造函数用常量引用
//设置Qt串行化版本
dsIn.setVersion(QDataStream::Qt_5_0);//使用Qt 5.0 版本流
//变量
int nVersion;
double dblValue;
QString strName;
//串行化输入
dsIn>>nVersion>>dblValue>>strName;
//打印
qDebug()<<nVersion;
qDebug()<<fixed<<dblValue;
qDebug()<<strName;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QByteArray ba = TestSerialOut();
TestSerialIn(ba);
return a.exec();
}