zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    45 岁,还写代码吗?
    给你 8 个接私活的网站
    一文回顾 Java 入门知识(下)
    5 种前途迷茫的编程语言
    JVM 内存的结构模型、堆与堆栈原理、对象在内存中的结构
    mysql 索引是否能提高UPDATE,DELETE,INSERT 处理速度
    【诈尸】【游戏】多人联机游戏推荐
    250.统计同值子树
    366. 寻找二叉树的叶子节点
    156.上下翻转二叉树
  • 原文地址:https://www.cnblogs.com/findumars/p/6568869.html
Copyright © 2011-2022 走看看