【问题标题】:How to know that QDataStream cannot deserialize something?如何知道 QDataStream 不能反序列化某些东西?
【发布时间】:2019-04-02 07:39:01
【问题描述】:

请考虑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无法将文件内容反序列化为QStringqint32以及如何处理QDatastream中的此类反序列化错误?

【问题讨论】:

  • 我喜欢在尝试反序列化之前包含数据的校验和并检查其有效性。通过该检查会大大增加成功反序列化的机会。只是不要使用 Qt 自己的校验和函数,它的 16 位输出相当平庸。

标签: c++ qt deserialization qdatastream


【解决方案1】:

根据官方文档,您可以(并且应该)使用Read Transactions

  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 时,您应该确定数据的顺序和组成。

【讨论】:

  • 您能否提供更多代码来说明如何帮助查找传入数据中是否存在错误。例如,如果 file.dat 是垃圾。
  • 仅仅是:if (!in.commitTransaction()) { qDebug("eror"); }
  • @uni ,你必须自己检查你的数据。 QDataStream 仅在数据可读取时负责读取操作本身
  • 我的意思是一种检查传入数据是否至少可以从数据流中提取的方法(我稍后会检查它)。你的回答真的很有帮助。谢谢! Спасибо!
猜你喜欢
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
相关资源
最近更新 更多