如题,两个类的使用曾经也让我很困惑,差不多整了个把礼拜才最终明白其中的一点道道。现在看到好多学习者也碰到了这方面的问题,就把我的一些见解共享出来,希望能有所帮助。
这两个类的名字中都有stream这个关键字,也就是“流”的意思。说到数据流,大部分都有自己的格式,比如数字电视的一堆标准。我猜测,这两个类就是为了方便这方面的应用。而我们自己使用的时候,尤其是传输网络数据,或者格式很多的数据的时候,也可以采用这个类。比如:
QByteArray data;
QDataStream in(data);
int i;
QString j;
QStringList k;
QPixmap m;
in << i << j << k << m;
数据很乱,很难用其它的方法去存储或传输,而使用QDataStream来做就会很方便,读取的时候我们可以这样(假定通过网络接收了这些数据):
QByteArray data = socked.readAll();
QDataStream out(data);
int i;
QString j;
QStringList k;
QPixmap m;
out >> i >> j >> k >> m;
这样就完成了一次很多格式或类型数据的传输了,我们获取到的i、j、k、m,虽然格式各不相同,但是使用QDataStream的方式来读取和输出,能够保证输出内容正是你输入的,同时使用也很方便,因为有这些方便的操作符使用。
既然这些数据类型或格式都不相同,那么可以想象,在我读取完i j k m这些数据后,肯定不会保持其原始状态,会自动加入一些东西,一方面要保证最后能够正确的读取,比如加上一些特殊的数据间的间隔符。甚至可能还会有一些压缩,这些不得而知,但总之可以这样简单的理解,当我们执行完 in << i << j << k << m; 的时候,data里面的数据,已经不会是原来那些数据的简单累加了,如果在这个时候要想打印其结果,要么打印不出来,要么不是原始的数据。
所以,当我们在调试的时候,如果出现数据显示不出来的问题,就看一下,是否是因为让我们的data在编码之后和解码之前显示。如果是,就调整一下,在别的位置将调试数据打印出来。