• 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

  • 相关阅读:
    mysql的缓冲查询和非缓冲查询
    通过中看不中用的代码分析Ioc容器,依赖注入....
    register_shutdown_function AND fastcgi_finish_request
    laravel5源码讲解整理
    ERROR! MySQL is running but PID file could not be found
    读《高性能javascript》笔记(一)
    看php手册2015-03-19版后备注
    rawurlencode / urlencode
    Zen Cart屏蔽中文语言浏览器
    WooCommerce Shortcode 简码使用方式说明
  • 原文地址:https://www.cnblogs.com/findumars/p/6568869.html
Copyright © 2020-2023  润新知