qt序列化自定义对象_尝试使用QDatastream序列化自定义类的QList时出错C2679
时间: 2023-12-10 09:38:02 浏览: 121
Qt自定义结构序列化
在使用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;
```
阅读全文