QDataStream对QVector的序列化

最近发现QDataStream这个好东东,序列化发送数据很方便,与大家分享一下。

客户端:

line.h

 1 #ifndef LINE_H
 2 #define LINE_H
 3 #include <QString>
 4 
 5 class Line
 6 {
 7 public:
 8     Line();
 9 
10 public:
11     int pointX;
12     int pointY;
13     int pointZ;
14 
15     QString pointName;
16 
17 public:
18     void getPoint();
19     void setPoint();
20 
21 };
22 
23 #endif // LINE_H

line.cpp

 1 #include "line.h"
 2 
 3 Line::Line()
 4 {
 5 }
 6 
 7 
 8 void Line::getPoint()
 9 {
10 
11 }
12 
13 void Line::setPoint()
14 {
15 
16 }


myvector.h

 1 #ifndef MYVECTOR_H
 2 #define MYVECTOR_H
 3 
 4 #include <QVector>
 5 #include <QDebug>
 6 #include "line.h"
 7 
 8 class MyVector:public QVector<Line>
 9 {
10 public:
11     MyVector();
12 
13     friend QDataStream& operator <<(QDataStream &out,MyVector &myVector);
14 
15     friend QDataStream& operator >>(QDataStream &in,MyVector &myVector);
16 
17     int x;
18 };
19 
20 class ChildVector:public MyVector
21 {
22 public:
23     ChildVector();
24 
25 public:
26     friend QDataStream& operator <<(QDataStream &out,ChildVector &childVector);
27 
28     friend QDataStream& operator >>(QDataStream &in,ChildVector &childVector);
29 
30     int y;
31     int z;
32     int childData;
33 
34 };
35 
36 #endif // MYVECTOR_H

myvector.cpp

 1 #include "myvector.h"
 2 
 3 MyVector::MyVector()
 4 {
 5 }
 6 
 7 
 8 QDataStream& operator <<(QDataStream &out,MyVector &myVector)
 9 {
10     out << quint32(myVector.size());
11     qDebug() <<"myVector---size()"<<myVector.size()<<endl;
12 
13     for (typename QVector<Line>::const_iterator it = myVector.begin(); it != myVector.end(); ++it)
14     {
15         out << it->pointName << it->pointX << it->pointY << it->pointZ;
16         qDebug()<<"it->pointName####"<<it->pointName<<"it->pointX$$$$$"<<it->pointX<<"it->pointY%%%%"<<it->pointY<<"it->pointZ^^^^^"<<it->pointZ<<endl;
17     }
18     out << myVector.x;
19     return out;
20 }
21 
22 
23 
24 QDataStream& operator >>(QDataStream &in,MyVector &myVector)
25 {
26     myVector.clear();
27     quint32 c;
28     in >> c;
29     myVector.resize(c);
30     for(quint32 i = 0;i < c;++i)
31     {
32         Line tLine;
33         in >> tLine.pointName >> tLine.pointX >> tLine.pointY >> tLine.pointZ;
34     }
35     in >> myVector.x;
36     return in;
37 }
38 
39 ChildVector::ChildVector()
40 {
41 
42 }
43 
44 QDataStream& operator <<(QDataStream &out,ChildVector &childVector)
45 {
46     qDebug() <<"myVector---size()"<<childVector.size()<<endl;
47 
48     MyVector *kk = &childVector;
49     out << *kk;
50     out << childVector.y << childVector.z<<childVector.childData;
51     return out;
52 }
53 
54 QDataStream& operator >>(QDataStream &in,ChildVector &childVector)
55 {
56     MyVector *kk = &childVector;
57     in << *kk;
58     in >> childVector.y >> childVector.z >> childVector.childData;
59 
60     return in;
61 }

tcpclient.h

 1 #ifndef TCPCLIENT_H
 2 #define TCPCLIENT_H
 3 
 4 #include <QObject>
 5 #include <QDataStream>
 6 #include <Qt/qtcpserver.h>
 7 #include <Qt/qtcpsocket.h>
 8 #include <Qt/qhostinfo.h>
 9 #include <Qt/qhostaddress.h>
10 
11 #include "myvector.h"
12 
13 class TcpClient : public QObject
14 {
15     Q_OBJECT
16 public:
17     //explicit TcpClient(QObject *parent = 0);
18     TcpClient():m_iOut(&byteArrayWrite,QIODevice::WriteOnly)
19     {
20         m_nPort = 8080;
21         m_bStatus = false;
22         tcpClient = NULL;
23 
24         //设置数据流的版本,客户端和服务器端使用的版本要相同
25         m_iOut.setVersion(QDataStream::Qt_4_6);
26         //设置发送长度初始值为0
27         m_iOut<<(quint32)0;
28     }
29 
30 signals:
31 
32 public slots:
33     void slotGetStatus();
34 
35 public:
36     void initConnection(QString ip);
37     void updata();
38 
39     QDataStream m_iIn;
40     QDataStream m_iOut;
41     QByteArray byteArrayWrite;
42 
43     QTcpSocket *tcpClient;
44 
45     //MyVector myVector;
46 
47     QString m_sIpAddress;
48     int m_nPort;
49     bool m_bStatus;
50 };
51 
52 #endif // TCPCLIENT_H

tcpclient.cpp

 1 #include "tcpclient.h"
 2 
 3 //TcpClient::TcpClient(QObject *parent) :
 4 //    QObject(parent)
 5 //{
 6 
 7 //}
 8 
 9 void TcpClient::initConnection(QString ip)
10 {
11     m_sIpAddress = ip;
12     QHostAddress address;
13     address.setAddress(ip);
14 
15     if(tcpClient == NULL)
16     {
17         tcpClient = new QTcpSocket(this);
18     }
19 
20     tcpClient->abort();
21 
22     tcpClient->connectToHost(address,8080);
23 
24 
25 
26     //connect(tcpClient,SIGNAL(readyRead()),this,SLOT(readData()));
27     //connect(tcpClient,SIGNAL(disconnected()),this,SLOT(slotDisconnect()));
28     //connect(tcpClient,SIGNAL(connected()),this,SLOT(sendData()));
29     m_bStatus = connect(tcpClient,SIGNAL(connected()),this,SLOT(slotGetStatus()));
30 
31     while(!m_bStatus)
32     {
33         initConnection(m_sIpAddress);
34     }
35 }
36 
37 void TcpClient::slotGetStatus()
38 {
39 
40 }
41 
42 void TcpClient::updata()
43 {
44     //回到字节流起始位置
45     m_iOut.device()->seek(0);
46     //重置字节流长度
47     m_iOut << (quint32) (byteArrayWrite.size()-sizeof(quint32));
48     //往套接字缓存中写入数据,并发送
49     int writeBlock = tcpClient->write(byteArrayWrite);
50 
51     qDebug()<<"writeBlock******"<<writeBlock;
52 
53     byteArrayWrite.resize(0);
54 
55     tcpClient->waitForReadyRead(1000);
56 }

test.h

 1 #ifndef TEST_H
 2 #define TEST_H
 3 
 4 #include <QObject>
 5 #include "tcpclient.h"
 6 
 7 class Test : public QObject
 8 {
 9     Q_OBJECT
10 public:
11     explicit Test(QObject *parent = 0);
12 
13 signals:
14 
15 public slots:
16     void getData();
17 
18 public:
19      TcpClient *tcpClt;
20 };
21 
22 #endif // TEST_H

test.cpp

 1 #include "test.h"
 2 
 3 Test::Test(QObject *parent) :
 4     QObject(parent)
 5 {
 6     tcpClt = new TcpClient();
 7 }
 8 
 9 void Test::getData()
10 {
11     QString ipAddress("192.168.154.128");
12 
13     tcpClt->initConnection(ipAddress);
14 
15     ChildVector myVector;
16 
17     Line tLine;
18     for(int i = 0;i < 10;i++)
19     {
20         tLine.pointName = QString("test")+QString::number(i);
21         tLine.pointX = 100 + i*10;
22         tLine.pointY = 150 + i*100;
23         tLine.pointZ = 5000 + i*1000;
24         myVector.append(tLine);
25     }
26 
27     myVector.x = 1000;
28     myVector.y = 2000;
29     myVector.z = 3000;
30     myVector.childData = 30;
31 
32     tcpClt->m_iOut << myVector;
33 
34     tcpClt->updata();
35 }

 

服务端接收:

line.h  line.cpp,myvector.h myvector.cpp不再添加,同客户端

tcpserver.h

 1 #ifndef TCPSERVER_H
 2 #define TCPSERVER_H
 3 
 4 #include <Qt/qtcpserver.h>
 5 #include <Qt/qtcpsocket.h>
 6 #include <Qt/qhostinfo.h>
 7 #include <Qt/qhostaddress.h>
 8 #include <Qt/qnetworkinterface.h>
 9 #include <QObject>
10 
11 #include "myvector.h"
12 
13 class TcpServer : public QObject
14 {
15     Q_OBJECT
16 public:
17     explicit TcpServer(QObject *parent = 0,int port = 8080);
18 
19     ChildVector myVector;
20 
21 signals:
22 
23 public slots:
24     void readData();
25     //void deleteSlot();
26     void slotConnected();
27 
28 private:
29     QTcpServer *m_pServer;
30     QTcpSocket *m_pTcpClientSocket;
31 
32 
33 };
34 
35 #endif // TCPSERVER_H

tcperver.cpp

 1 #include "tcpserver.h"
 2 
 3 int GLOBAL_LENGTH = 0;
 4 
 5 TcpServer::TcpServer(QObject *parent, int port) :
 6     QObject(parent)
 7 {
 8     m_pServer = new QTcpServer(this);
 9     if(m_pServer->listen(QHostAddress::Any,port))
10     {
11           qDebug()<<"listen Successfully!!!";
12     }
13     connect(m_pServer,SIGNAL(newConnection()),this,SLOT(slotConnected()));
14 }
15 
16 void TcpServer::slotConnected()
17 {
18     qDebug()<<"slotConnected!!!";
19     m_pTcpClientSocket = m_pServer->nextPendingConnection();
20 
21     bool bConnect = connect(m_pTcpClientSocket,SIGNAL(readyRead()),this,SLOT(readData()));
22     //connect(m_pTcpClientSocket,SIGNAL(disconnected()),m_pTcpClientSocket,SLOT(deleteLater()));
23     qDebug()<<"bConnect"<<bConnect;
24 }
25 
26 void TcpServer::readData()
27 {
28     quint32 nextBlockSize = 0;
29     QDataStream in(m_pTcpClientSocket);
30     in.setVersion(QDataStream::Qt_4_6);
31     quint32 bufferSize = m_pTcpClientSocket->bytesAvailable();
32     if(nextBlockSize == 0)
33     {
34         if(m_pTcpClientSocket->bytesAvailable()<sizeof(quint32))
35         {
36             return;
37         }
38         in>>nextBlockSize;
39         qDebug()<<"nextBlockSize:"<<nextBlockSize<<"m_pTcpClientSocket->bytesAvailable()"<<m_pTcpClientSocket->bytesAvailable();
40     }
41 
42     GLOBAL_LENGTH = nextBlockSize/sizeof(quint32);
43 
44     in >> myVector;
45     //qDebug()<<"-------------"<<myVector.x<<"@@@@@@@@@@"<<"myVector.size()#####"<<myVector.size()<<endl;
46      for(int i = 0; i < myVector.size() ;i++)
47      {
48          qDebug()<<"***********"<<myVector.at(i).pointName<<"###";
49          qDebug()<<"***********"<<myVector.at(i).pointX<<"###";
50          qDebug()<<"***********"<<myVector.at(i).pointY<<"###";
51          qDebug()<<"***********"<<myVector.at(i).pointZ<<"###"<<endl;
52      }
53 
54      qDebug()<<"-------------"<<myVector.x<<"@@@@@@@@@@"<<"myVector.y#####"<<myVector.y<<"@@@@@@@@@@"<<"myVector.y#####"<<myVector.z<<"childData-----"<<myVector.childData<<endl;
55      if(nextBlockSize==0xFFFF)
56      {
57          return;
58      }
59      if(bufferSize < nextBlockSize)
60      {
61          return;
62      }
63 }

 

以上代码经过编译测试通过,希望对你有所帮助。

 

转载于:https://www.cnblogs.com/wanzaiyimeng/p/4616984.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值