Qt QDATAsTREAM 序列化一个 包含XYZA 坐标的结构体
时间: 2024-03-05 07:52:00 浏览: 90
可以通过重载 QDataStream 的 << 和 >> 运算符实现将包含XYZA坐标的结构体进行序列化和反序列化,具体的实现代码如下:
```
struct Point4D
{
double x;
double y;
double z;
double a;
};
QDataStream &operator<<(QDataStream &out, const Point4D &point)
{
out << point.x << point.y << point.z << point.a;
return out;
}
QDataStream &operator>>(QDataStream &in, Point4D &point)
{
in >> point.x >> point.y >> point.z >> point.a;
return in;
}
```
然后在需要将结构体进行序列化的地方,使用 QDataStream 对象来写入数据:
```
Point4D point;
QDataStream out(&data, QIODevice::WriteOnly);
out << point;
```
读取时,则使用 QDataStream 对象来读取数据:
```
Point4D point;
QDataStream in(&data, QIODevice::ReadOnly);
in >> point;
```
相关问题
qt序列化自定义对象_尝试使用QDatastream序列化自定义类的QList时出错C2679
在使用QDataStream序列化自定义类的QList时,可能会遇到C2679错误。这个错误表示在编译时,编译器无法找到一个可以匹配的操作符。
为了解决这个问题,你需要在你的自定义类中重载以下两个操作符:
1. QDataStream& operator<<(QDataStream& out, const YourClass& obj)
2. QDataStream& operator>>(QDataStream& in, YourClass& obj)
这两个操作符分别用于序列化和反序列化自定义类的对象。
下面是一个简单的例子来说明如何重载这两个操作符:
```c++
class MyClass
{
public:
QString name;
int age;
friend QDataStream& operator<<(QDataStream& out, const MyClass& obj)
{
out << obj.name << obj.age;
return out;
}
friend QDataStream& operator>>(QDataStream& in, MyClass& obj)
{
in >> obj.name >> obj.age;
return in;
}
};
Q_DECLARE_METATYPE(MyClass); // 声明MyClass是Qt元类型
QDataStream& operator<<(QDataStream& out, const QList<MyClass>& list)
{
out << quint32(list.size());
for (const MyClass& obj : list) {
out << obj;
}
return out;
}
QDataStream& operator>>(QDataStream& in, QList<MyClass>& list)
{
quint32 size;
in >> size;
list.clear();
for (quint32 i = 0; i < size; i++) {
MyClass obj;
in >> obj;
list.append(obj);
}
return in;
}
```
在上面的例子中,我们重载了MyClass类的序列化和反序列化操作符,并且还重载了QList<MyClass>的序列化和反序列化操作符。注意,我们还需要声明MyClass是Qt元类型,这样才能在使用QVariant和QMetaProperty时使用它。
现在你可以使用QDataStream来序列化和反序列化自定义类的QList了:
```c++
QList<MyClass> list;
list.append(MyClass{"Alice", 25});
list.append(MyClass{"Bob", 30});
QByteArray data;
QDataStream stream(&data, QIODevice::WriteOnly);
stream << list;
QList<MyClass> newList;
stream.device()->seek(0);
stream >> newList;
```
Qt6用QDataStream序列化std::vector<T>
Qt6中的`QDataStream`是一个用于序列化和反序列化的流式处理工具,它支持自定义数据类型的存储。当你想将`std::vector<T>`(其中T是任何Qt可以处理的数据类型,如`QObject`, `QString`, 等)保存到文件或通过网络传输时,可以使用`QDataStream`。
以下是序列化`std::vector<T>`的基本步骤:
1. 首先,你需要包含必要的头文件:
```cpp
#include <QDataStream>
#include <vector>
```
2. 定义你要序列化的`std::vector`:
```cpp
std::vector<T> myVector;
```
3. 使用`QDataStream`创建输入/输出流。例如,如果你想要写入文件:
```cpp
QDataStream out(&file, QIODevice::WriteOnly);
```
或者如果要在内存中操作:
```cpp
QByteArray memoryData;
QDataStream memStream(&memoryData, QIODevice::WriteOnly);
```
4. 序列化`std::vector`:
```cpp
out << static_cast<const qintptr&>(myVector.size()); // 写入大小
for (const auto& item : myVector) {
out << item; // 对每个元素进行序列化,这里假设T有一个适当的QDataStream流操作符重载
}
```
5. 如果你想读取,就反转方向并操作输入流:
```cpp
QDataStream in(fileOrMemoryData, QIODevice::ReadOnly);
qintptr size;
in >> size; // 从流中读取大小
std::vector<T> deserialized(size); // 创建与读取大小匹配的新vector
for (qiint i = 0; i < size; ++i) {
T item;
in >> item; // 逐个读取并解序列化元素
deserialized[i] = item;
}
```
阅读全文