Сериализировать класс с Qlist пользовательских классов в качестве члена (используя QDataStream)

Я пытаюсь сериализовать урок класса (мой собственный класс [я удалил некоторые сеттеры]), который включает в себя QList (Вопрос также является моим пользовательским классом). Во время сериализации теста я получаю SIGSEGV (ошибка сегментации) при десериализации любого объекта QList внутри класса Lesson.

UPD1: Я сериализовал QList* и теперь изменил его на QList, но SIGSEGV все равно появляется.

class Lesson
{

public:
Lesson();
Lesson(QString, QString, QList<Question>);

QString getName() const;
QString getText() const;
QList<Question>* getTest() const;

friend QDataStream &operator<<(QDataStream &out, const Lesson &l){
    out << l.getName() << l.getText();
    out << l.getTest();
    return out;
}

friend QDataStream &operator>>(QDataStream &in, Lesson &l){
    QString name;
    QString text;
    QList<Question> t;
    in >> name >> text >> t;
    l = Lesson(name, text, t);
    return in;
}


friend QDataStream &operator<<(QDataStream &out, const Lesson *&l){
    out << l->getName() << l->getText();
    return out;
}

friend QDataStream &operator>>(QDataStream &in, Lesson *&l){
    QString name;
    QString text;
    QList<Question> test;
    in >> name >> text;// >> test;
    l = new Lesson(name, text, test);
    return in;
}


private:
QString text;
QList <Question>* test_;
QString name;



};

// вопрос класса начинается здесь

class Question
{

public:
explicit Question(QString, QList<QString>, int type, QList<int> ans);
Question();

friend QDataStream &operator <<(QDataStream& out, const Question &q){
    out << q.type << q.questText << q.variants << q.answer;
    return out;
}

friend QDataStream &operator >>(QDataStream& in, Question &q){
    int type;
    QString quesText;
    QList<QString> vars;
    QList<int>ans;
    in >> type >> q >> vars >> ans;
    q = Question(quesText, vars, type, ans);
    return in;
}

friend QDataStream &operator <<(QDataStream& out, const Question *&q){
    //out.setByteOrder(QSysInfo::ByteOrder);
    out << q->type << q->questText << q->variants << q->answer;
    return out;
}

friend QDataStream &operator >>(QDataStream& in, Question *&q){
    //in.setByteOrder(QSysInfo::ByteOrder);
    int type;
    QString quesText;
    QList<QString> vars;
    QList<int>ans;
    in >> type >> q >> vars >> ans;
    q = new Question(quesText, vars, type, ans);
    return in;
}

int gettype() const;
QString getquestText() const;
QList<QString> getvariants() const;
QList<int> getanswer() const;

signals:

public slots:

private:
int type; // see constants.h
QString questText;
QList<QString> variants;
QList<int> answer;


};

// main.cpp, где я тестирую сериализацию

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Core *c = new Core;
MainWindow w;
QObject::connect(&w, SIGNAL(sendCheckUserValidityToCore(QString,QString)), c,      SLOT(checkUserValidity(QString,QString)));
QObject::connect(&w, SIGNAL(sendLessonToCore(Lesson*)), c, SLOT(saveLesson(Lesson*)));
QObject::connect(&w, SIGNAL(requestLessonByIdfromCore(QString)), c, SLOT(getLessonById(QString)));
QObject::connect(c, SIGNAL(returnLessonById(Lesson*)), &w, SIGNAL(returnLessonByIdfromCore(Lesson*)));
QObject::connect(c, SIGNAL(entranceOff()), &w, SLOT(entranceOff()));

QFile tfile("lessons/tFile.stc");
tfile.open(QIODevice::ReadWrite);
QDataStream inout(&tfile);
QList<Question> qlistq;
Question q;
q.setQuestText("QWhy");
qlistq.insert(0, q);

Lesson lessont("hello", "welt", qlistq);
Lesson lessonout;
inout << lessont;
inout.device()->reset();
inout >> lessonout;
qDebug() << lessonout.getName();


return a.exec();
}

person Asalle    schedule 21.04.2014    source источник


Ответы (2)


Вы сериализуете QList<Question>* и десериализуете QList<Question>. Измените свой operator<< на:

friend QDataStream &operator<<(QDataStream &out, const Lesson &l){
    out << name << text << *test_;
    return out;
}
person AntiClimacus    schedule 21.04.2014
comment
Поменял член на QList‹Вопрос›, ничего не изменилось. - person Asalle; 21.04.2014
comment
А как насчет того, чтобы скомпилировать вашу программу с отладочной информацией и запустить в gdb...? - person AntiClimacus; 21.04.2014
comment
Пользуюсь отладчиком std Qt, пока понял, что SIGSEGV происходит при достижении in ›› type ›› q ›› vars ›› ans; оператора››, но очевидного объяснения этому я не вижу. Меня интересовало, все ли я делаю правильно, нет ли явной ошибки? Как я вижу, нет. Может быть, я должен просто продолжать отладку - person Asalle; 21.04.2014

Я узнал, что не так. Я просто не инициализировал всех членов класса Question, что вызвало segfault

person Asalle    schedule 22.04.2014