保存并加载QList< Class *>.归档 [英] Save and load QList<Class*> to file

查看:195
本文介绍了保存并加载QList< Class *>.归档的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个ContactData类和一个拥有QList的FriendList类,并且<</>>运算符.

I have a class ContactData and a class FriendList holding a QList and I overloaded the << / >> operators.

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的空列表. 这就是我被困住的地方.


It does save a file in the desired direction, but unfortunately loading gives me an empty list of the size 0. This is where I'm stuck..

任何人都可以帮忙吗?

推荐答案

从代码中重建列表:

for(int i = 0; i < list->size(); i++) 

问题是,当您反序列化为空列表时,size()将返回0(或与您必须从磁盘读取的内容完全不相关的值),并且无论如何您都必须从流中读取项目,但不会与实际列表大小无关.此外,由于list是空的,因此您必须首先创建一个新元素(因为内部没有元素,所以不能只调用at()).您可以在项目前写一个整数(例如),然后在反序列化时读取它:

Problem is that when you're deserializing into an empty list size() will return 0 (or a value completely unrelated to what you have to read from disk) and anyway you have to read items from stream, it doesn't matter actual list size. Moreoverlist is empty so you have first to create a new element (you can't just call at() because there aren't elements inside). You can write an integer (for example) before items then read it when deserializing:

QDataStream &operator>>(QDataStream& in, FriendList* list)
{
    int count = 0;
    in >> count;

    for(int i = 0; i < count; i++)
    {
        ContactData* contact = new ContactData();
        in >> contact;

        list->m_list->push_back(contact);
    }

    return in;
}

也不要忘记在序列化功能中写入count.或者,您可以阅读所有内容,直到输入流结束:

Do not forget to write count in serialization function too. As alternative you may read everything until end of input stream:

QDataStream &operator>>(QDataStream& in, FriendList* list)
{
    int count = 0;
    in >> count;

    while (!in.atEnd())
    {
        ContactData* contact = new ContactData();
        in >> contact;

        list->m_list->push_back(contact);
    }

    return in;
}

要完成检查,请在评论中 Kamil说,如果您在序列化过程中没有任何错误,可能只是拼写错误,但是...

To finish check what Kamil said in comment, if you don't have any error during serialization probably it's just a typo but...

这篇关于保存并加载QList&lt; Class *&gt;.归档的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆