在QDataStream中序列化类

Serializing class in QDataStream

本文关键字:序列化 QDataStream      更新时间:2023-10-16

我试图保存3个QVector<QPoint>和一个int与QDataStream

我超载了operator<<(),但如果我试图保存一些东西,没有出现在文件中。

我检查了QVector是否为空,但它不是。

下面是CloudData类的operator<<save()函数:

CloudData.h

#include <QDataStream>
#include <QVector>
#include <QPoint>
class CloudData
{
public:
CloudData();
QVector<QPoint> getPolyVector() const;
QVector<QPoint> getPathPointVector() const;
QVector<QPoint> getSupPointVector() const;
int getRandSeed() const;
bool save(QString);
friend QDataStream& operator <<(QDataStream &dataStream, const CloudData &cd)
{
    dataStream << cd.getPolyVector() << cd.getPathPointVector()
               << cd.getSupPointVector() << cd.getRandSeed();
    return dataStream;
}
private:
QVector<QPoint> m_polyVector;
QVector<QPoint> m_pathPointVector;
QVector<QPoint> m_supPointVector;
int m_randSeed;
};

CloudData.cpp

#include "clouddata.h"
#include <QFile>
CloudData::CloudData()
{
}
void CloudData::setPolyVector(QVector<QPoint> pVec)
{
    m_polyVector = pVec;
}
void CloudData::setPathPointVector(QVector<QPoint> ppVec)
{
    m_pathPointVector = ppVec;
}
void CloudData::setSuppPointVector(QVector<QPoint> spVec)
{
    m_supPointVector = spVec;
}
void CloudData::setRandSeed(int randSeed)
{
    m_randSeed = randSeed;
}
bool CloudData::save(QString filename)
{
    QFile file(filename);
    if(!file.open(QIODevice::WriteOnly))
        return false;
    QDataStream out(&file);
    out.setVersion(QDataStream::Qt_4_8);
    out << this;
    file.close();
    return true;
}

最后,这里是调用save()的函数:

void CloudWidget::saveCloudData()
{
    QString filename = QFileDialog::getSaveFileName(this,tr("Save cloud clutter data"),
                       "/Users/Admin/Downloads/", "Cloud Clutter Data (*.ccd)");
    m_cloudData.setPolyVector(m_polygon);
    m_cloudData.setPathPointVector(m_pathPointVector);
    m_cloudData.setSuppPointVector(m_supPointVector);
    m_cloudData.save(filename);
}

我相信这句话:

out << this;
save()方法中的

应该是:

out << *this;

& lt; & lt;操作符作用于类的引用,而不是指向类的指针。

下面的测试代码说明了这一点:
#include <QFile>
#include <QTextStream>
#include <QDebug>
class StreamTest
{
    public:
        StreamTest() { var1 = "var1"; var2 = "var2"; }
    QString var1;
    QString var2;
    friend QTextStream& operator <<(QTextStream &textStream, const StreamTest &st)
    {
        textStream << st.var1 << st.var2;
        return textStream;
    }
    void save(void)
    {
        QString str_1;
        QTextStream text_stream_1(&str_1);
        text_stream_1 << this;
        qDebug() << str_1;
        QString str_2;
        QTextStream text_stream_2(&str_2);
        text_stream_2 << *this;
        qDebug() << str_2;
    }
};
int main(int argc, char *argv[])
{
    StreamTest st;
    st.save();
}

运行代码生成如下输出:

"0x7fff18070c10"
"var1var2"

this打印指针的值,而*this打印期望的输出。