QByteArray儲存二進制數據(包括結構體,自定義QT對象)


因為利用QByteArray可以很方便的利用其API對內存數據進行訪問和修改, 構建數據庫blob字段時必不可少; 那如何向blob內寫入自定義的結構體和類

//自定義person結構體

 typedef struct  
{  
    int age;  
    char name[20];  
}Person;  
  
//向QByteArray寫入多個結構體  
void writeStruct()  
{  
    QByteArray ba;  
    ba.resize(2*sizeof(Person)); //設置容量  
  
    //序列化  
    for(int i=0;i<2;i++)  
    {  
        Person p1;  
        p1.age=10+i;  
    strcpy(p1.name,"javaeye");  
        memcpy(ba.data()+i*sizeof(Person),&p1,sizeof(Person)); //指針移動,寫入多個數據  
    }  
  
    //還原數據  
    Person *person=(Person*)ba.data();  
    qDebug()<<person->age<<"---"<<person->name;  
  
    person++;  
    qDebug()<<person->age<<"---"<<person->name;  
} 

memcpy只能處理字段為基本類型的結構體, 當使用QString name, 我用person->name去訪問其值, 程序崩潰; 由此可見,內存數據無法還原構建成QString類. 如果要寫入自定的QT類, 只能借助QBuffer了, 通過二進制流寫入

 

 2. QBuffer寫入QT自定義結構體

 

    //QBuffer序列化自定義對象  
    typedef struct  
    {  
        int age;  
        QString name;  
    }QPerson;  
      
    /** 
     *@brief 重載自定義對象的輸入 
     */  
    inline QDataStream &operator<<(QDataStream &out,const QPerson &per)  
    {  
        out<<per.age<<per.name;  
        return out;  
    }  
      
    /** 
     *@brief 重載自定義對象的輸出 
     */  
    inline QDataStream &operator>>(QDataStream &in,QPerson &per)  
    {  
        int age;  
        QString name;  
        in>>age>>name;  
      
        per.age=age;  
        per.name=name;  
        return in;  
    }  
      
    /** 
     * @brief QBuffer能處理QT自定義類型 
     */  
    void testQBuffer()  
    {  
        QByteArray ba;  
        ba.resize(2*sizeof(QPerson));  
      
        QBuffer buffer(&ba);  
        buffer.open(QIODevice::WriteOnly);  
      
        //輸入  
        QDataStream out(&buffer);  
        for(int i=0;i<2;i++)  
        {  
            QPerson per;  
            per.age=20+i;  
            per.name=QString("sun_%1").arg(i+1);  
            out<<per;  
        }  
        buffer.close();  
      
      
        //輸出  
        QBuffer buf(&ba);  
        buf.open(QIODevice::ReadOnly);  
      
        QDataStream in(&buf);  
        for(int i=0;i<2;i++)  
        {  
          QPerson per;  
          in>>per;  
          qDebug()<<per.age<<"---"<<per.name;  
        }  
        buf.close();  
    }  

 

 


免責聲明!

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



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