zoukankan      html  css  js  c++  java
  • Qt持久性对象进行序列化(同时比较了MFC与Java的方法)

    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/
  • 相关阅读:
    Google pagespeed优化首页加载速度详解
    juqery 学习之三 选择器<子元素><表单>
    juqery 学习之五 文档处理<包裹、替换、删除、复制>
    juqery 学习之四 筛选<过滤>
    关于鼠标点击其他地方隐藏层的实例(要引入jquery包哦)
    JAVASCRIPT 对象 用法(offset screen scroll client)
    [分享]NopCommerce支付插件开发步骤(页 1) 扩展开发
    juqery 学习之五 文档处理<插入>
    juqery 学习之六 CSS<css、位置、宽高>
    th scope="row"和th scope="col"什么意思??
  • 原文地址:https://www.cnblogs.com/findumars/p/5169950.html
Copyright © 2011-2022 走看看