Передавайте строку с именем класса.
Класса как такового сейчас нет(не знаю какой будет). Представь что первый раз передается строка QString, а второй картинка QImage. QDataStream может их сам сериализовать, но вот определить что пришла именно картинка не может. Нужно самому создать переменную QImage im и в нее поместить значение из потока.
QTcpSocket* pClientSocket = (QTcpSocket*)sender();
QDataStream in(pClientSocket);
QImage im;
in >> im;
Что бы понять что пришло изображение я на второе место после размера отправленного пакета помещаю идентификатор типа(например 1)
QTcpSocket* m_pTcpSocket;//объявлен в .h
QByteArray arrBlock;
QDataStream out(&arrBlock, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_5_3);
QByteArray pic;
int type;
QFile file("D:/image");
file.open(QIODevice::ReadOnly);
pic = file.readAll(); //bit-picture
type = 1;
out << quint16(0) << type << pic;
m_pTcpSocket->write(arrBlock);
И на стороне сервера при получении делаю проверку полученного идентификатора типа.
QTcpSocket* pClientSocket = (QTcpSocket*)sender();
QDataStream in(pClientSocket);
in.setVersion(QDataStream::Qt_5_3);
for (;
{
if (!m_nNextBlockSize)
{
if (pClientSocket->bytesAvailable() < (int)sizeof(quint16))//проверяем размер
{
break;
}
in >> m_nNextBlockSize;
}
if (pClientSocket->bytesAvailable() < m_nNextBlockSize)
{
break;
}
QByteArray image;
QImage im;
int type;
in >> type;
if(type == 1)//проверяем тип
{
in >> image;
im = QImage::fromData(image, "TGA");
m_ptxt->setPixmap(QPixmap::fromImage(im));
m_ptxt->show();
m_nNextBlockSize = 0;
}
И вот представте что передано дофига разных типов переменных, и каждый раз проверка на if не выглядит хорошим решением. Можно использовать switch он побыстрее но я хочу узнать есть ли другой способ узнать какой тип(класс) пришел от клиента.
Проблема не в десериализации, а в определении пришедшего типа(повышение быстродействия). Может есть хороший метод для этого. Подобное должно использоваться в многопользовательских играх по идее.