[Qt 4.6] Serializowanie struktur danych, QVector


(Kornicameister) #1

zacznę od tego co próbuję zrobić

piszę appkę do robienia notatek na komputerze i doszedłem do etapu zapis/odczyt z pliku, doczytałem że QDataStream pięknie wspiera serializowanie struktury danych jaką jest QVector, nie mniej jednak zapis nie sprawił problemów… albo inaczej, nie pojawił się błąd kompilacji

metoda do zapisu

void NoteSaver::saveToBinary(){

    QFile file("./notes.nceb"); //neb means -> NotesCoolExtensionBinary

    if(!file.open(QIODevice::WriteOnly)){

        qDebug() <<"Opening the file failded";

    }else{

        QDataStream binary(&file);

        binary.operator <<(notesVector);

    }

    file.setPermissions(QFile::ReadOwner | QFile::WriteOwner);

    file.close();

}

nie mniej jednak nie potrafię odczytać z pliku, używając tej metody

void NoteLoader::loadFromBinary(){

    QFile file("./notes.nceb");

    if(file.exists()){

        if(!file.open(QIODevice::ReadWrite)){

            qDebug() <<"File exists but opening the file failed";

        }else{

            QDataStream binaryToRead(&file);

            binaryToRead.operator >>(this->notesVector);

        }

    }else{

        qDebug() <<"File does not exist";

    }

    file.close();

}

co ważne jest -> notesVector to tak naprawdę wskaźnik na wektor wskaźników na obiekty typu noteFrame

przy odczycie dostaję errory, że nie używam prawidłowej implementacji operatora

po odwołaniu się do dokumentacji (patrz sam dół strony -> http://doc.qt.nokia.com/4.6/qvector.html), dowiedziałem się, że typ danych w wektorze ma implementować operatory… no i tutaj jest problem, bo

  1. skoro tak, to czemu zapis nie objawił się nieprawidłowym użyciem operatora

  2. jak powinna przebiegać dokładnie implementacja operatora :confused:

a ogólnie co zrobiłem, nie tak :stuck_out_tongue:

Dodane Pn sie 30, 2010 9:58 pm

dobrze, problem rozwiązałem

ogólnie, jak już wspomniałem w dokumentacji jest napisane, że typ danych przechowywanych w kontenerze musi implementować odpowiednie operatory

czyli jeśli przechowuje w np. wektorze obiekty myClass, to musi mieć ona zaimplementowany operator, znowu jeśli klasa ma obiekty klasy myClass2, również myClass2 musi implementować te same operatora na swój własny sposób, a ta rekurencja zatrzymuje się dopiero po osiągnięciu podstawowych typów serializowanych jakie są wymienione w dokumentacji Qt