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

客户端:

line.h

 #ifndef LINE_H
#define LINE_H
#include <QString> class Line
{
public:
Line(); public:
int pointX;
int pointY;
int pointZ; QString pointName; public:
void getPoint();
void setPoint(); }; #endif // LINE_H

line.cpp

 #include "line.h"

 Line::Line()
{
} void Line::getPoint()
{ } void Line::setPoint()
{ }

myvector.h

 #ifndef MYVECTOR_H
#define MYVECTOR_H #include <QVector>
#include <QDebug>
#include "line.h" class MyVector:public QVector<Line>
{
public:
MyVector(); friend QDataStream& operator <<(QDataStream &out,MyVector &myVector); friend QDataStream& operator >>(QDataStream &in,MyVector &myVector); int x;
}; class ChildVector:public MyVector
{
public:
ChildVector(); public:
friend QDataStream& operator <<(QDataStream &out,ChildVector &childVector); friend QDataStream& operator >>(QDataStream &in,ChildVector &childVector); int y;
int z;
int childData; }; #endif // MYVECTOR_H

myvector.cpp

 #include "myvector.h"

 MyVector::MyVector()
{
} QDataStream& operator <<(QDataStream &out,MyVector &myVector)
{
out << quint32(myVector.size());
qDebug() <<"myVector---size()"<<myVector.size()<<endl; for (typename QVector<Line>::const_iterator it = myVector.begin(); it != myVector.end(); ++it)
{
out << it->pointName << it->pointX << it->pointY << it->pointZ;
qDebug()<<"it->pointName####"<<it->pointName<<"it->pointX$$$$$"<<it->pointX<<"it->pointY%%%%"<<it->pointY<<"it->pointZ^^^^^"<<it->pointZ<<endl;
}
out << myVector.x;
return out;
} QDataStream& operator >>(QDataStream &in,MyVector &myVector)
{
myVector.clear();
quint32 c;
in >> c;
myVector.resize(c);
for(quint32 i = ;i < c;++i)
{
Line tLine;
in >> tLine.pointName >> tLine.pointX >> tLine.pointY >> tLine.pointZ;
}
in >> myVector.x;
return in;
} ChildVector::ChildVector()
{ } QDataStream& operator <<(QDataStream &out,ChildVector &childVector)
{
qDebug() <<"myVector---size()"<<childVector.size()<<endl; MyVector *kk = &childVector;
out << *kk;
out << childVector.y << childVector.z<<childVector.childData;
return out;
} QDataStream& operator >>(QDataStream &in,ChildVector &childVector)
{
MyVector *kk = &childVector;
in << *kk;
in >> childVector.y >> childVector.z >> childVector.childData; return in;
}

tcpclient.h

 #ifndef TCPCLIENT_H
#define TCPCLIENT_H #include <QObject>
#include <QDataStream>
#include <Qt/qtcpserver.h>
#include <Qt/qtcpsocket.h>
#include <Qt/qhostinfo.h>
#include <Qt/qhostaddress.h> #include "myvector.h" class TcpClient : public QObject
{
Q_OBJECT
public:
//explicit TcpClient(QObject *parent = 0);
TcpClient():m_iOut(&byteArrayWrite,QIODevice::WriteOnly)
{
m_nPort = ;
m_bStatus = false;
tcpClient = NULL; //设置数据流的版本,客户端和服务器端使用的版本要相同
m_iOut.setVersion(QDataStream::Qt_4_6);
//设置发送长度初始值为0
m_iOut<<(quint32);
} signals: public slots:
void slotGetStatus(); public:
void initConnection(QString ip);
void updata(); QDataStream m_iIn;
QDataStream m_iOut;
QByteArray byteArrayWrite; QTcpSocket *tcpClient; //MyVector myVector; QString m_sIpAddress;
int m_nPort;
bool m_bStatus;
}; #endif // TCPCLIENT_H

tcpclient.cpp

 #include "tcpclient.h"

 //TcpClient::TcpClient(QObject *parent) :
// QObject(parent)
//{ //} void TcpClient::initConnection(QString ip)
{
m_sIpAddress = ip;
QHostAddress address;
address.setAddress(ip); if(tcpClient == NULL)
{
tcpClient = new QTcpSocket(this);
} tcpClient->abort(); tcpClient->connectToHost(address,); //connect(tcpClient,SIGNAL(readyRead()),this,SLOT(readData()));
//connect(tcpClient,SIGNAL(disconnected()),this,SLOT(slotDisconnect()));
//connect(tcpClient,SIGNAL(connected()),this,SLOT(sendData()));
m_bStatus = connect(tcpClient,SIGNAL(connected()),this,SLOT(slotGetStatus())); while(!m_bStatus)
{
initConnection(m_sIpAddress);
}
} void TcpClient::slotGetStatus()
{ } void TcpClient::updata()
{
//回到字节流起始位置
m_iOut.device()->seek();
//重置字节流长度
m_iOut << (quint32) (byteArrayWrite.size()-sizeof(quint32));
//往套接字缓存中写入数据,并发送
int writeBlock = tcpClient->write(byteArrayWrite); qDebug()<<"writeBlock******"<<writeBlock; byteArrayWrite.resize(); tcpClient->waitForReadyRead();
}

test.h

 #ifndef TEST_H
#define TEST_H #include <QObject>
#include "tcpclient.h" class Test : public QObject
{
Q_OBJECT
public:
explicit Test(QObject *parent = ); signals: public slots:
void getData(); public:
TcpClient *tcpClt;
}; #endif // TEST_H

test.cpp

 #include "test.h"

 Test::Test(QObject *parent) :
QObject(parent)
{
tcpClt = new TcpClient();
} void Test::getData()
{
QString ipAddress("192.168.154.128"); tcpClt->initConnection(ipAddress); ChildVector myVector; Line tLine;
for(int i = ;i < ;i++)
{
tLine.pointName = QString("test")+QString::number(i);
tLine.pointX = + i*;
tLine.pointY = + i*;
tLine.pointZ = + i*;
myVector.append(tLine);
} myVector.x = ;
myVector.y = ;
myVector.z = ;
myVector.childData = ; tcpClt->m_iOut << myVector; tcpClt->updata();
}

服务端接收:

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

tcpserver.h

 #ifndef TCPSERVER_H
#define TCPSERVER_H #include <Qt/qtcpserver.h>
#include <Qt/qtcpsocket.h>
#include <Qt/qhostinfo.h>
#include <Qt/qhostaddress.h>
#include <Qt/qnetworkinterface.h>
#include <QObject> #include "myvector.h" class TcpServer : public QObject
{
Q_OBJECT
public:
explicit TcpServer(QObject *parent = ,int port = ); ChildVector myVector; signals: public slots:
void readData();
//void deleteSlot();
void slotConnected(); private:
QTcpServer *m_pServer;
QTcpSocket *m_pTcpClientSocket; }; #endif // TCPSERVER_H

tcperver.cpp

 #include "tcpserver.h"

 int GLOBAL_LENGTH = ;

 TcpServer::TcpServer(QObject *parent, int port) :
QObject(parent)
{
m_pServer = new QTcpServer(this);
if(m_pServer->listen(QHostAddress::Any,port))
{
qDebug()<<"listen Successfully!!!";
}
connect(m_pServer,SIGNAL(newConnection()),this,SLOT(slotConnected()));
} void TcpServer::slotConnected()
{
qDebug()<<"slotConnected!!!";
m_pTcpClientSocket = m_pServer->nextPendingConnection(); bool bConnect = connect(m_pTcpClientSocket,SIGNAL(readyRead()),this,SLOT(readData()));
//connect(m_pTcpClientSocket,SIGNAL(disconnected()),m_pTcpClientSocket,SLOT(deleteLater()));
qDebug()<<"bConnect"<<bConnect;
} void TcpServer::readData()
{
quint32 nextBlockSize = ;
QDataStream in(m_pTcpClientSocket);
in.setVersion(QDataStream::Qt_4_6);
quint32 bufferSize = m_pTcpClientSocket->bytesAvailable();
if(nextBlockSize == )
{
if(m_pTcpClientSocket->bytesAvailable()<sizeof(quint32))
{
return;
}
in>>nextBlockSize;
qDebug()<<"nextBlockSize:"<<nextBlockSize<<"m_pTcpClientSocket->bytesAvailable()"<<m_pTcpClientSocket->bytesAvailable();
} GLOBAL_LENGTH = nextBlockSize/sizeof(quint32); in >> myVector;
//qDebug()<<"-------------"<<myVector.x<<"@@@@@@@@@@"<<"myVector.size()#####"<<myVector.size()<<endl;
for(int i = ; i < myVector.size() ;i++)
{
qDebug()<<"***********"<<myVector.at(i).pointName<<"###";
qDebug()<<"***********"<<myVector.at(i).pointX<<"###";
qDebug()<<"***********"<<myVector.at(i).pointY<<"###";
qDebug()<<"***********"<<myVector.at(i).pointZ<<"###"<<endl;
} qDebug()<<"-------------"<<myVector.x<<"@@@@@@@@@@"<<"myVector.y#####"<<myVector.y<<"@@@@@@@@@@"<<"myVector.y#####"<<myVector.z<<"childData-----"<<myVector.childData<<endl;
if(nextBlockSize==0xFFFF)
{
return;
}
if(bufferSize < nextBlockSize)
{
return;
}
}

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

QDataStream对QVector的序列化的更多相关文章

  1. QT序列化操作(比较复杂和完善)

    应用需求: 在网盘开发过程中有这样一个需求,即对文件版本进行控制,即记录文件版本的更替信息,这里说的更替信息仅仅是记录不同时刻的文件变化,即文件的增.删.改.重命名等操作.在每个待监控的目录下都会保存 ...

  2. 【大话QT之七】QT序列化操作

    应用需求: 在网盘开发过程中有这样一个需求.即对文件版本号进行控制,即记录文件版本号的更替信息,这里说的更替信息不过记录不同一时候刻的文件变化,即文件的增.删.改.重命名等操作.在每一个待监控的文件夹 ...

  3. QT 序列化/串行化/对象持久化

    本文以一个实例讲解Qt的序列化方法: Qt版本 4.8.0 Qt序列化简介 Qt采用QDataStream来实现序列化,QT针对不同的实例化对象有不同的要求.这里主要分两类,即:QT中原生的数据类型, ...

  4. qt的udp的初步使用(转)

    该程序实现的功能是:局域网内,每个用户登录到聊天软件,则软件界面的右端可以显示在线用户列表,分别显示的是用户名,主机名,ip地址.软件左边那大块是聊天内容显示界面,这里局域网相当于qq中的qq群,即群 ...

  5. 基于QTcpSocket和QTcpServer的Tcp通讯以及QDataStream序列化数据

    最近要在QT下开发Tcp通讯,发送序列化数据以便于接收. 这里涉及到几个问题: 1.QTcpSocket.QTcpServer的通讯 2.QDataStream序列化数据 多的不说,直接上干货!!! ...

  6. c++/qt的数据序列化和反序列化

    序列化以及反序列化的实现 struct Body { double weight; double height; }; //结构体 struct People { int age; Body dBod ...

  7. Qt持久性对象进行序列化

    Mfc和Java中自定义类的对象都可以对其进行持久性保存,Qt持久性对象进行序列化当然也是必不可少的.不过这个问题还真困扰了我很长时间……Mfc通过重写虚函数Serialize().Java则是所属的 ...

  8. Qt序列化格式分析(qint,QString)(非常简单好用)

    最近项目需要进行QT开发环境下对传输对象进行序列化与反序列化处理,对基本类型的处理在使用QT默认的序列化方式还是完全手工序列化这两种方式之间有些犹疑不定,边想了解下QT默认序列化基本类型的格式,项目中 ...

  9. Qt持久性对象进行序列化(同时比较了MFC与Java的方法)

    Mfc和Java中自定义类的对象都可以对其进行持久性保存,Qt持久性对象进行序列化当然也是必不可少的.不过这个问题还真困扰了我很长时间……Mfc通过重写虚函数Serialize().Java则是所属的 ...

随机推荐

  1. IOS 本地通知 UILocalNotification

    IOS 本地通知 UILocalNotification [本文章第四部分中的代码逻辑来自网上的借鉴,并非我自己原创] 大概一个月前,我开始跟着做IOS项目了.学习C++,了解Objective-C, ...

  2. 大数据应用之Windows平台Hbase客户端Eclipse开发环境搭建

    大数据应用之Windows平台Hbase客户端Eclipse开发环境搭建 大数据应用之Windows平台Hbase客户端Eclipse环境搭建-Java版 作者:张子良 版权所有,转载请注明出处 引子 ...

  3. Remobjects使用经验

    RemObjects RemObjects提示:我们相信本文是正确的,但我们不做任何保证.在此感谢Henrick 写的文章,很高兴在此发表. 介绍RemObjects是功能强大可扩展的远程框架;但是当 ...

  4. SQLAlchemy on the way

    SQLAlchemy Trial This is a great ORM ( Object-Relational Mapper ) which is compatible with  xxxx and ...

  5. Standford机器学习 聚类算法(clustering)和非监督学习(unsupervised Learning)

    聚类算法是一类非监督学习算法,在有监督学习中,学习的目标是要在两类样本中找出他们的分界,训练数据是给定标签的,要么属于正类要么属于负类.而非监督学习,它的目的是在一个没有标签的数据集中找出这个数据集的 ...

  6. c++代码的陪伴下----菜鸟的转变

    在c++代码的陪伴下快乐的长大 学了c++也快一年了,在这里把自己的心得体会说一下吧. 1.感觉自己这一年做过的代码行数也不少,博客点击量和浏览量却不是很多,可能是自己所编的程序里面都是很基础的吧,对 ...

  7. Java NIO之内存映射文件——MappedByteBuffer

    大多数操作系统都可以利用虚拟内存实现将一个文件或者文件的一部分"映射"到内存中.然后,这个文件就可以当作是内存数组来访问,这比传统的文件要快得多. 内存映射文件的一个关键优势是操作 ...

  8. ubuntu下vsftpd配置

    网上的文章好难懂啊..只想要简单粗暴,弄好能用就行啊,复杂的以后研究不行吗...折腾好久,其实弄出来能用不就这么点内容吗... 本文在Ubuntu Server 14.04 amd64系统测试. 安装 ...

  9. windows全系列激活脚本-改良版.cmd

    @ECHO OFFTITLE Windows 全版本系统激活cscript //nologo %Systemroot%\system32\slmgr.vbs -skms 10.1.1.12ECHO 检 ...

  10. SVG基础以及使用Javascript DOM操作SVG

    SVG 不依赖分辨率 支持事件处理器 最适合带有大型渲染区域的应用程序(比如谷歌地图) 复杂度高会减慢渲染速度(任何过度使用 DOM 的应用都不快) 不适合游戏应用 Canvas 依赖分辨率 不支持事 ...