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/
  • 相关阅读:
    开放就像死亡访问之后就能回头——Leo鉴书84
    将博客搬至CSDN
    将博客搬至CSDN
    滚动条
    Perl Pack写的一个数据报表程序
    利用hash 数组打印标题
    Linux显示只显示目录文件
    Linux显示按文件名降序文件
    Linux显示以时间生升序显示文件
    Linux显示按文件大小降序排列
  • 原文地址:https://www.cnblogs.com/findumars/p/5169950.html
Copyright © 2011-2022 走看看