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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM