У меня есть класс ContactData и класс FriendList, в котором есть QList, и я перегрузил операторы </>> </>>.Сохраните и загрузите QList <Class*> в файл
contactdata.h
class ContactData
{
//all public for testing
public:
ContactData();
QString m_name;
QString m_description;
bool m_online;
};
QDataStream &operator<<(QDataStream& out, ContactData& contactData);
QDataStream &operator>>(QDataStream& in, ContactData* contactData);
contactdata.cpp
QDataStream &operator<<(QDataStream &out, ContactData& contactData)
{
out << contactData.m_name;
out << contactData.m_description;
return out;
}
QDataStream &operator>>(QDataStream &in, ContactData* contactData)
{
in >> contactData->m_name;
in >> contactData->m_description;
return in;
}
friendlist.h
#include "contactdata.h"
typedef QList<ContactData*> TFriendList;
class FriendList
{
...
public:
TFriendList* m_list;
...
};
QDataStream &operator<<(QDataStream& out, FriendList& list);
QDataStream &operator>>(QDataStream& in, FriendList* list);
friendlist.cpp
QDataStream &operator<<(QDataStream& out, FriendList& list)
{
for(int i = 0; i < list.size(); i++)
{
ContactData contact = *list.at(i);
out << contact;
}
return out;
}
QDataStream &operator>>(QDataStream& in, FriendList* list)
{
for(int i = 0; i < list->size(); i++)
{
ContactData* contact = list->m_list->at(i);
in >> contact;
}
return in;
}
// typedef QList<ContactData*> TFriendList;
private:
FriendList* m_friendList;
Функция экономии
QString path = "/friendlist.bin";
QFile file(path);
if (file.open(QIODevice::WriteOnly))
{
QDataStream out(&file);
out << m_friendList;
file.close();
}
загрузки функции
QString path = "/friendlist.bin";
QFile file(path);
if(file.exists())
{
if (file.open(QIODevice::ReadOnly))
{
QDataStream in(&file);
in >> m_friendList;
file.close();
qDebug() << "FriendList.size() = " << m_friendList->size();
}
}
Это делает сохранить файл в нужном направлении, но, к сожалению, загрузка дает мне пустой список размера 0. Это где я застрял ..
Может кто-нибудь Помогите?
Из кода: для (INT I = 0; i < list-> size(); i ++) для самого десериализационного списка. когда список пуст (и вы хотите его загрузить), size() вернет 0, поэтому ничего не будет десериализовано. Вы должны (попытаться) десериализовать до тех пор, пока поток не закончится (или не запишите размер списка в начале). –
У вас есть ошибка в коде. Ваш << оператор ожидает 'FriendList &', но вы даете 'FriendList *' –