因為利用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(); }