QT 序列化/串行化/对象持久化

本文以一个实例讲解Qt的序列化方法:

  • Qt版本 4.8.0

Qt序列化简介

Qt采用QDataStream来实现序列化,QT针对不同的实例化对象有不同的要求。这里主要分两类,即:QT中原生的数据类型,例如:QString、QMap、QHash等,这对这种原生数据类型的序列化,我们不需要做其它额外的操作,直接就可以序列化到文件中;还有一类特殊的就是我们自己定义的数据结构或类,这种方式利用QDataStream不能直接实现序列化,必须重载<<和>>操作符,只有重载完之后才可以按我们的要求实现序列化。 ——引用自 [ Monkey_Online]

闲话少说直接上实例,创建一个Qt控制台应用程序:

@Freedom - qsampledata.h
#ifndef QSAMPLEDATA_H
#define QSAMPLEDATA_H

#include <QObject>

class QSampleData : public QObject
{
public:
    QSampleData();
    virtual ~QSampleData();
    QSampleData& operator=(const QSampleData &other);

    friend QDataStream& operator>>(QDataStream&, QSampleData&);
    friend QDataStream& operator<<(QDataStream&, QSampleData&);

    //定义的数据成员
    int m_nType;
    QString m_strName;
};
#endif

 

@Freedom - qsampledata.cpp
#include "qsampledata.h"
#include <QDataStream>


QSampleData::QSampleData()
{
    m_nType = 0;
    m_strName = "";
}

QSampleData::~QSampleData()
{

}

QSampleData& QSampleData::operator =(const QSampleData& other)
{
    m_nType = other.m_nType;
    m_strName = other.m_strName;
    return *this;
}

QDataStream& operator>>(QDataStream& src, QSampleData& data)
{
    /*
     错误:C2679: 二进制“>>”: 没有找到接受“quint32”类型的右操作数的运算
    解决方法:因为没有添加头文件<QDataStream>
    */
    src >> data.m_nType ;
    src >> data.m_strName;
    return src;
}
QDataStream& operator<<(QDataStream& out, QSampleData& data)
{
    out << data.m_nType << data.m_strName;
    return out;
}

 

@Freedom - main.cpp
/*Qt Serialization   Qt串行化*/

#include <QCoreApplication>
#include <QFile>
#include <QDataStream>
#include <QTextStream>
#include "ckdrawrectangle.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    //控制台输出--将标准流封装为QTextStream对象
    QTextStream cin(stdin, QIODevice::ReadOnly);
    QTextStream cout(stdout, QIODevice::WriteOnly);
    QTextStream cerr(stderr, QIODevice::WriteOnly);
    //////////////////////////////////////////////////////
    QSampleData data;
    data.m_nType = 12;
    data.m_strName = "vic.MINg";
    QFile file("file.dat");

    //写入
    file.open(QIODevice::WriteOnly);
    QDataStream out(&file);
    out << data;
    file.close();

    //读取
    QSampleData readData;
    file.open(QIODevice::ReadOnly);
    QDataStream in(&file);
    in >> readData;
    file.close();

    //////////////////////////////////////////////////////
    cout << data.m_nType<<endl;
    cout << data.m_strName;
    cout.flush();

    return a.exec();
}

更新

-*2015-11-09 第一次更新

 

http://blog.csdn.net/qq2399431200/article/details/49741715

posted @ 2017-03-17 21:59  findumars  Views(5255)  Comments(1Edit  收藏  举报