Skip to content

Instantly share code, notes, and snippets.

@micjabbour
Created September 16, 2017 12:58
Show Gist options
  • Save micjabbour/f6063f25369dd57b682c2c69175c3c11 to your computer and use it in GitHub Desktop.
Save micjabbour/f6063f25369dd57b682c2c69175c3c11 to your computer and use it in GitHub Desktop.
toying around with QDataStream and QVariant serialization
#include <QtCore>
#include <QtNetwork>
//some custom data structure depending on QList
using DataStructure = QList<QPair<QString, QString>>;
//Q_DECLARE_METATYPE(DataStructure)
/*QDataStream& operator<<(QDataStream& stream, const DataStructure& ds) {
stream << (quint32) ds.size();
for(auto e : ds) stream << e;
return stream;
}
QDataStream& operator>>(QDataStream& stream, DataStructure& ds) {
ds.clear();
quint32 count; stream >> count;
ds.reserve(count);
for(quint32 i=0; i<count; i++) {
QPair<QString, QString> element;
stream >> element;
ds.push_back(std::move(element));
}
return stream;
}*/
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//qRegisterMetaType<DataStructure>("DataStructure");
qRegisterMetaTypeStreamOperators<DataStructure>("DataStructure");
QTcpSocket socket;
socket.connectToHost(QHostAddress("127.0.0.1"), 9966);
quint32 msgSize = 0;
QObject::connect(&socket, &QTcpSocket::connected, []{ qDebug() << "connected"; });
QObject::connect(&socket, &QTcpSocket::readyRead, [&]{
qDebug() << "ready read";
QDataStream in(&socket);
in.setVersion(QDataStream::Qt_5_9);
if(msgSize == 0) {
if(socket.bytesAvailable() < static_cast<int>(sizeof(quint32))) return;
in >> msgSize;
}
if(socket.bytesAvailable() < msgSize) return;
QVariant variant;
QString str;
quint64 number;
in >> variant;
qDebug() << "received variant of type: " << variant.typeName();
in >> str;
qDebug() << str;
in >> str;
qDebug() << str;
in >> number;
qDebug() << number;
in >> str;
qDebug() << str;
socket.disconnectFromHost();
socket.close();
qApp->quit();
});
return a.exec();
}
#include <QtCore>
#include <QtNetwork>
//some custom data structure depending on QList
using DataStructure = QList<QPair<QString, QString>>;
//Q_DECLARE_METATYPE(DataStructure)
/*QDataStream& operator<<(QDataStream& stream, const DataStructure& ds) {
stream << (quint32) ds.size();
for(const auto& e : ds) stream << e;
return stream;
}
QDataStream& operator>>(QDataStream& stream, DataStructure& ds) {
ds.clear();
quint32 count; stream >> count;
ds.reserve(count);
for(quint32 i=0; i<count; i++) {
QPair<QString, QString> element;
stream >> element;
ds.push_back(std::move(element));
}
return stream;
}*/
int main(int argc, char* argv[]) {
QCoreApplication a(argc, argv);
//qRegisterMetaType<DataStructure>("DataStructure");
qRegisterMetaTypeStreamOperators<DataStructure>("DataStructure");
DataStructure dataStructure;
//fill data structure with dummy data
dataStructure.push_back(QPair<QString, QString>("a","aa"));
dataStructure.push_back(QPair<QString, QString>("c","cc"));
dataStructure.push_back(QPair<QString, QString>("b","bb"));
QByteArray msg;
QDataStream out(&msg, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_5_9);
QVariant variant = QVariant::fromValue(dataStructure);
qDebug() << variant.typeName() << " " << (int)variant.type();
out << static_cast<quint32>(0);
out << variant;
out << QString("test");
out << QString("another test");
out << static_cast<quint64>(666);
out << QString("final test");
out.device()->seek(0); out << static_cast<quint32>(msg.size() - sizeof(quint32));
QTcpServer server;
QObject::connect(&server, &QTcpServer::newConnection, [&]{
QTcpSocket* socket = server.nextPendingConnection();
QObject::connect(socket, &QTcpSocket::bytesWritten, [socket]{
socket->disconnectFromHost();
socket->close();
socket->deleteLater();
qApp->quit();
});
socket->write(msg);
socket->flush();
});
server.listen(QHostAddress::Any, 9966);
return a.exec();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment