QT笔记——QDataStream 序列化 与 反序列化

1. 序列化与反序列化目的
通常在程序运行过程中我们需要对一个对象当前的状态进行存储或者传输,在传递和保存对象时,保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中,之后根据字节流中保存的对象状态及描述信息,通过反序列化重建对象,反序列化之后的对象状态跟序列化之前的对象状态一致。

写QDataStream 遇到的问题:
在UDP 通信中发送一个结构体如下

struct Person
{
	char  name[20];
	int age;
	int score;
	Person()
	{
		memset(name, 0, sizeof(name));
		age = 0;
		score = 0;
	}
};

我想进行序列化操作,提示报错:
QT笔记——QDataStream 序列化 与 反序列化_第1张图片
我的解决办法是不给他进行序列化,单独写

//输入时:
QByteArray text_data;
QDataStream write(&text_data, QIODevice::WriteOnly);
write << p1.age << p1.score;
write.writeRawData(p1.name, sizeof(p1.name));

//输出时:
QByteArray array;
QDataStream read(&array, QIODevice::ReadOnly);  //读取数据流
Person p;
read >>  p.age >> p.score ;
read.readRawData(p.name, sizeof(p.name));

2.QDataStream可以数据化的类型有:
bool, float, double, const char * qint8, qint16, qint32, qint64,
quint8, quint16, quint32, quint64 QString, QTime, QTransform, QUrl,
QVariant QBitArray, QByteArray QBrush, QColor, QCursor, QFont, QIcon,
QImage QDate, QDateTime QEasingCurve, QGenericMatrix, QKeySequence
QHash, QLinkedList,QList, QMap, QMargins,
QMatrix4x4, QPair QPalette, QPen, QPicture, QPixmap, QPoint,
QQuaternion, QRect QRegExp, QRegularExpression, QRegion, QSize
QVector2D, QVector3D, QVector4D, QVector

QT支持的数据类型

自定义数据结构序列化与反序列化
QDataStream只能序列化基本类型,对于自定义类或者数据结构则需要在自定义类中声明并实现友元函数friend:

//自定义结构体
struct Person
{
	int age;
	int score;
	QString a;
	QPoint b;
	QFont c;
	QVector<int> d;
	double e;
	bool f;
};
//序列化
friend  QDataStream& operator<<(QDataStream& stream, const Person& p)
{
	stream << p.age << p.score << p.a << p.b << p.c << p.d << p.e << p.f;
	return stream;
}
//反序列化
friend QDataStream& operator>>(QDataStream& stream, Person& p)
{
	stream >> p.age >> p.score >> p.a >> p.b >> p.c >> p.d >> p.e >> p.f;
	return stream;
}

处理数据时:

QBuffer text_data;
text_data.open(QIODevice::WriteOnly);
QDataStream write(&text_data);
write << p1;
//写入时:							
Person p1;
p1.age = 20;
p1.score = 60;
p1.a = "lion_cxq";
p1.b = QPoint(40, 50);
p1.c = QFont();
p1.d.push_back(4);
p1.d.push_back(5);
p1.e = 3.14;
p1.f = true;
QByteArray array;
QDataStream read(&array, QIODevice::ReadOnly);  
Person p;
read >> p;
//读取时:
qDebug() 
<< p.age 
<< p.score 
<< p.a 
<< p.b 
<< p.c 
<< p.d 
<< p.f 
<< p.e;

看下运行结果:
在这里插入图片描述
注意:在序列化与反序列化的过程中 输入和 输出的 类型 和 顺序要保持一致

你可能感兴趣的:(QT,qt)