因为利用QByteArray可以很方便的利用其API对内存数据进行访问和修改, 构建数据库blob字段时必不可少; 那如何向blob内写入自定义的结构体和类

1. 利用memcpy拷贝内存数据

//自定义person结构体

  1. typedef struct
  2. {
  3. int age;
  4. char name[20];
  5. }Person;
  6. //向QByteArray写入多个结构体
  7. void writeStruct()
  8. {
  9. QByteArray ba;
  10. ba.resize(2*sizeof(Person)); //设置容量
  11. //序列化
  12. for(int i=0;i<2;i++)
  13. {
  14. Person p1;
  15. p1.age=10+i;
  16. strcpy(p1.name,"javaeye");
  17. memcpy(ba.data()+i*sizeof(Person),&p1,sizeof(Person)); //指针移动,写入多个数据
  18. }
  19. //还原数据
  20. Person *person=(Person*)ba.data();
  21. qDebug()<<person->age<<"---"<<person->name;
  22. person++;
  23. qDebug()<<person->age<<"---"<<person->name;
  24. }

memcpy只能处理字段为基本类型的结构体, 当使用QString name, 我用person->name去访问其值, 程序崩溃; 由此可见,内存数据无法还原构建成QString类. 如果要写入自定的QT类, 只能借助QBuffer了, 通过二进制流写入

 2. QBuffer写入QT自定义结构体

  1. //QBuffer序列化自定义对象
  2. typedef struct
  3. {
  4. int age;
  5. QString name;
  6. }QPerson;
  7. /**
  8. *@brief 重载自定义对象的输入
  9. */
  10. inline QDataStream &operator<<(QDataStream &out,const QPerson &per)
  11. {
  12. out<<per.age<<per.name;
  13. return out;
  14. }
  15. /**
  16. *@brief 重载自定义对象的输出
  17. */
  18. inline QDataStream &operator>>(QDataStream &in,QPerson &per)
  19. {
  20. int age;
  21. QString name;
  22. in>>age>>name;
  23. per.age=age;
  24. per.name=name;
  25. return in;
  26. }
  27. /**
  28. * @brief QBuffer能处理QT自定义类型
  29. */
  30. void testQBuffer()
  31. {
  32. QByteArray ba;
  33. ba.resize(2*sizeof(QPerson));
  34. QBuffer buffer(&ba);
  35. buffer.open(QIODevice::WriteOnly);
  36. //输入
  37. QDataStream out(&buffer);
  38. for(int i=0;i<2;i++)
  39. {
  40. QPerson per;
  41. per.age=20+i;
  42. per.name=QString("sun_%1").arg(i+1);
  43. out<<per;
  44. }
  45. buffer.close();
  46. //输出
  47. QBuffer buf(&ba);
  48. buf.open(QIODevice::ReadOnly);
  49. QDataStream in(&buf);
  50. for(int i=0;i<2;i++)
  51. {
  52. QPerson per;
  53. in>>per;
  54. qDebug()<<per.age<<"---"<<per.name;
  55. }
  56. buf.close();
  57. }

最新文章

  1. koa简介
  2. MySQL问题记录--Can&#39;t connect to MySQL server on localhost (10061)解决方法
  3. Sort Characters By Frequency
  4. Aptana插件安装方法
  5. java的继承
  6. MongoDB 基础知识
  7. 谈谈Delph中的类和对象2---类可以理解成一种特殊的数据结构、类型转换
  8. printf();
  9. 运行时---关联Associated
  10. JS面向对象组件(一) ---包装对象与原型链
  11. 提示35. 怎样实现OfTypeOnly&lt;TEntity&gt;()这样的写法
  12. [转]Hadoop YARN任务提交流程
  13. Proxy 模式
  14. statusBarOrientation设备状态
  15. wget命令3(转载)
  16. js——cookie
  17. IOS网络请求之AFNetWorking 3.x 使用
  18. 获取页面中任意一个元素距离body的偏移量
  19. Winform界面中实现通用工具栏按钮的事件处理
  20. h5移动端屏幕适配

热门文章

  1. gzip: stdout: No space left on device问题的解决
  2. SQLite数据库增删改查操作
  3. Calculation
  4. comboBox的多选框之疑难杂症——逗号篇
  5. 在SAE上同步djanogo的mysql数据库
  6. Android Training精要(五)讀取Bitmap對象實際的尺寸和類型
  7. 深入理解object C中复制对象的用法(一)
  8. IT江湖
  9. JS 混淆加密
  10. Android 树形菜单
  11. 完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法zt
  12. dao代码模板
  13. asp.net实现断点续传
  14. require.js的初步认识
  15. UltraEdit中使用正则表达式替换
  16. 使用mpvue开发微信小程序
  17. SpringCloud学习笔记:SpringCloud简介(1)
  18. PHP加密解密方法,使用openssl加密解密
  19. 枚举进行位运算 枚举组合z
  20. OpenStack各组件逻辑关系、通信部署关系及工作流程