Как узнать, что QDataStream не может что-то десериализовать?

Обратите внимание на следующий фрагмент кода из документации QDataStream:

QFile file("file.dat");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);    // read the data serialized from the file
QString str;
qint32 a;
in >> str >> a;           // extract "the answer is" and 42

Есть ли способ узнать, что QDataStream не может десериализовать содержимое файла в QString и qint32, и как обрабатывать такие ошибки десериализации в QDatastream?


person uni    schedule 29.10.2018    source источник
comment
Мне нравится включать контрольную сумму данных и проверять ее достоверность, прежде чем даже пытаться десериализовать. Прохождение этой проверки значительно увеличивает шансы на успешную десериализацию. Просто не используйте собственную функцию контрольной суммы Qt, которая довольно посредственна с ее 16-битным выводом.   -  person dtech    schedule 29.10.2018


Ответы (1)


Согласно официальной документации, вы можете (и должны) использовать Чтение транзакций :

  in.startTransaction();

  QString str;
  qint32 a;

  in >> str >> a; // try to read packet atomically

  if(in.commitTransaction())
  {
      // read is ok, check the data you had read
  } 
  else
  {
      // wait for more data or show unknown error
  }

Если у вас есть файл в качестве IO-устройства, вы можете читать без транзакций, но вам придется вручную проверять, доступно ли необходимое количество данных. При использовании QDataStream вы должны быть уверены в последовательности и составе данных.

person Vladimir Bershov    schedule 29.10.2018
comment
Не могли бы вы предоставить больше кода, показывающего, как это помогает определить, есть ли ошибка во входящих данных. Например, если file.dat был мусором. - person uni; 29.10.2018
comment
Это просто: if (!in.commitTransaction()) { qDebug(eror); } - person uni; 29.10.2018
comment
@uni, ты должен проверить свои данные сам. QDataStream отвечает только за саму операцию чтения, если данные доступны для чтения - person Vladimir Bershov; 29.10.2018
comment
Я имел в виду способ проверить, можно ли хотя бы извлечь входящие данные из потока данных (я проверю это позже). Ваш ответ действительно помогает. Благодарю вас! Спасибо! - person uni; 29.10.2018