我基于Qt框架开发软件,我有一个Person结构体,有int age,QString name两个属性,我要把这个结构体的对象序列化和反序列化,怎么写代码
时间: 2024-10-16 19:14:29 浏览: 37
QT TCP客户端在子线程中发送结构体数据和接收信息普通数据信息
在Qt中,你可以使用QDataStream或者 QDomDocument/QDomElement 进行对象的序列化和反序列化。这里我将展示如何使用QDataStream:
首先,你需要包含所需的头文件,并创建一个名为`Person`的类,因为Qt不直接支持结构体作为类的替代:
```cpp
#include <QObject>
#include <QDataStream>
class Person : public QObject {
Q_OBJECT
public:
explicit Person(int age, const QString& name) : age(age), name(name) {}
int age;
QString name;
friend QDataStream &operator<<(QDataStream &out, const Person &p);
friend QDataStream &operator>>(QDataStream &in, Person &p);
};
```
然后添加序列化和反序列化的操作符重载:
```cpp
QDataStream &operator<<(QDataStream &out, const Person &p) {
out << p.age << p.name;
return out;
}
QDataStream &operator>>(QDataStream &in, Person &p) {
in >> p.age >> p.name;
return in;
}
```
为了读取和写入文件,你可以这样做:
```cpp
void serializeToFile(const Person &person, const QString &fileName) {
QFile file(fileName);
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QDataStream out(&file);
out << person;
file.close();
}
}
Person deserializeFromFile(const QString &fileName) {
QFile file(fileName);
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QDataStream in(&file);
Person person;
in >> person;
file.close();
return person;
} else {
qWarning("Failed to open file for reading");
return Person();
}
}
```
现在你可以通过`serializeToFile()`函数保存`Person`对象到文件,通过`deserializeFromFile()`函数从文件恢复对象。
阅读全文