QDataStream не может сериализовать данные

Я пытаюсь следовать руководству здесь и сериализовать объекты Qt. Вот мой код:

QFile file("/Users/kaustav/Desktop/boo.dat");
if (!file.open(QIODevice::WriteOnly)) {
    qDebug() << "Cannot open file for writing: "
         << qPrintable(file.errorString()) << endl; //no error message gets printed
    return 0;
}
QDataStream out(&file);   // we will serialize the data into the file
out.setVersion(QDataStream::QtQt 5.2.13); //adding this makes no difference
out << QString("the answer is");   // serialize a string
out << (qint32)42;

Когда я запускаю эту программу, файл создается на моем рабочем столе, но его размер 0 КБ, он пустой. Естественно, когда я попробую это:

 QFile file("/Users/kaustav/Desktop/boo.dat");
 file.open(QIODevice::ReadOnly);
 QDataStream in(&file);    // read the data serialized from the file
 in.setVersion(QDataStream::QtQt 5.2.13);
 QString str;
 qint32 w;
 in >> str >> w;

Я получаю пустую строку в str. Что я делаю не так? Если вам поможет, я использую Qt Creator 3.1.1 на основе Qt 5.2.1.


person SexyBeast    schedule 20.11.2014    source источник


Ответы (1)


Проверьте, возвращаются ли какие-либо ошибки при вызове open, и убедитесь, что вы закрыли файл с помощью file.close(), когда закончите с ним.

Поскольку вы используете Qt 5, вместо этого вам следует использовать QSaveFile, при сохранении данных.

person TheDarkKnight    schedule 20.11.2014
comment
Вуаля, добавление close() работает! Но зачем мне это нужно! В C++ дескрипторы файлов закрываются автоматически, когда переменная выходит из-под контроля, не так ли? - person SexyBeast; 20.11.2014
comment
Глядя на исходный код Qt для QFile, он вызывает close, который очищает поток. Возможно, QDataStream удаляется до того, как он успеет завершить потоковую передачу в файл. - person TheDarkKnight; 21.11.2014
comment
Да, это возможно. Спасибо, в любом случае! :) - person SexyBeast; 21.11.2014