You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用QDataStream反序列化QVector<int>报错,求解决方法

解决QDataStream反序列化QVector*的报错问题

嘿,我来帮你理清这个问题!你的报错原因其实很明确:你在序列化时误传了QVector的指针,而反序列化时QDataStream没有支持直接对指针进行操作的重载。

问题根源拆解

你写dataStream<<l_iVec;的时候,编译器没报错是因为Qt的QDataStream有针对任意指针的通用序列化重载——但它序列化的只是指针本身的内存地址,而不是QVector容器里的10、20、30这些元素!这根本不是你想要的序列化行为。

到了反序列化步骤dataStream>>l_iVec;,编译器直接报错,因为QDataStream从来没有定义过接受QVector<int>*作为右操作数的>>运算符,自然无法完成这个操作。

正确的解决方法

你需要操作QVector对象本身,而不是指针。这里有两种靠谱的写法:

写法1:解引用指针,操作实际对象

如果你必须用堆上的QVector指针,可以在序列化和反序列化时都对指针解引用:

QVector<int> *l_iVec = new QVector<int>(); 
l_iVec->push_back(10); 
l_iVec->push_back(20); 
l_iVec->push_back(30); 
l_iVec->push_back(40); 

QDataStream dataStream; 
dataStream << *l_iVec; // 解引用指针,序列化容器内的元素
dataStream >> *l_iVec; // 同样解引用,把数据写入指针指向的容器

写法2:直接使用栈上的QVector(更推荐)

Qt的容器都是隐式共享的,用栈对象既避免内存泄漏,写法也更简洁:

QVector<int> l_iVec;
l_iVec.push_back(10); 
l_iVec.push_back(20); 
l_iVec.push_back(30); 
l_iVec.push_back(40); 

QDataStream dataStream; 
dataStream << l_iVec; 
dataStream >> l_iVec; 

这样不管是序列化还是反序列化,都会正确处理QVector里的元素,不会再出现编译错误啦。

内容的提问来源于stack exchange,提问作者girish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:30:39