使用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
相关产品推荐
相关产品推荐

