zoukankan      html  css  js  c++  java
  • Qt持久性对象进行序列化

    Mfc和Java中自定义类的对象都可以对其进行持久性保存,Qt持久性对象进行序列化当然也是必不可少的。
    不过这个问题还真困扰了我很长时间……
    Mfc通过重写虚函数Serialize()、Java则是所属的类必须实现java.io.Serializable或Externalizable接口完成、
    Qt是怎么搞定这个事情那,QDataStream类:让我们不禁想起Mfc中的CAchive类、
    Java中的java.io.ObjectOutputStream/ObjectInputStream类,分别提供了对象的序列化和反序列化功能。
    现在还差什么了,那就是">>"和"<<"的实现了。
    哈哈,c++中friend友员派上用场了。假设你的类是QSampleData,实现以下俩个函数就可以了
        #ifndef QT_NO_DATASTREAM
            friend QDataStream& operator>>(QDataStream&, QSampleData&);
            friend QDataStream& operator<<(QDataStream&, QSampleData&);
        #endif
    当时这里不能忽略的事就是,QSampleData从QObject直接或间接派生,有个不带参数的构造函数,这都是老生常谈了~


    一个例子,这也是必须的。

    //比较懒,这次的注释就免了...
    class QSampleData : public QObject

    public:
        QChunnelData();
        virtual ~QChunnelData();
        QChunnelData& operator=(const QChunnelData &other);

    #ifndef QT_NO_DATASTREAM
        friend QDataStream& operator>>(QDataStream&, QChunnelData&);
        friend QDataStream& operator<<(QDataStream&, QChunnelData&);
    #endif 
        //定义的数据成员
        int m_nType;
        QString m_strName;
    };

     
    CSampleData::CSampleData()
    {
        m_nType = 0;
        m_strName = "";
    }
    CSampleData::~CSampleData()
    {
    }
    CSampleData::operator =(const CSampleData& other)
    {
        m_nType = other.m_nType;
        m_strName = other.m_strName;
        return *this;
    }
    #ifndef QT_NO_DATASTREAM
    QDataStream& operator>>(QDataStream& in, CSampleData& data)
    {
        in >> data.m_nType >> data.m_strName;
        return in;
    }
    QDataStream& operator<<(QDataStream& out, CSampleData& data)
    {
        out << data.m_nType << data.m_strName;
        return out;
    }
    #endif

    这样就QFile、QByteArray...可以关联QDataStream类的对象,进行读写操作了。

    QSampleData data;
    data.m_nTpye = 12;
    data.m_strName = "vic.MINg";
    QFile file("file.dat");
    file.open(QIODevice::WriteOnly);
    QDataStream out(&file);
    out << data;
    file.close();
    file.open(QIODevice::ReadOnly);
    QDataStream in(&file);
    in >> data;
    file.close();

    http://cool.worm.blog.163.com/blog/static/64339006200832642918250/

  • 相关阅读:
    可变速率的语音变调效果
    低音增强
    低质量音频伪装高质量音频的检测方法
    离线版-端点检测代码重写
    检测带人声的音乐
    音乐流派分类初步结果
    音乐和人声自动判别小结
    梯度下降法[转]
    梳状滤波器滤除谐波
    项目管理实战之团队管理 对团队的管理需要重视以下几个方面 一个系统不仅需要优秀的分析和设计,更需要一个良好的过程将其从蓝图转化为实现。这个过程中最重要的是对团队的管理,也就是人的管理
  • 原文地址:https://www.cnblogs.com/findumars/p/6250745.html
Copyright © 2011-2022 走看看