QByteArray储存二进制数据(包括结构体,自定义QT对象)
???? 因为利用QByteArray可以很方便的利用其API对内存数据进行访问和修改, 构建数据库blob字段时必不可少; 那如何向blob内写入自定义的结构体和类
????1. 利用memcpy拷贝内存数据
? ??//自定义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();}?