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