本文以一个实例讲解Qt的序列化方法:

  • Qt版本 4.8.0

Qt序列化简介

Qt采用QDataStream来实现序列化,QT针对不同的实例化对象有不同的要求。这里主要分两类,即:QT中原生的数据类型,例如:QString、QMap、QHash等,这对这种原生数据类型的序列化,我们不需要做其它额外的操作,直接就可以序列化到文件中;还有一类特殊的就是我们自己定义的数据结构或类,这种方式利用QDataStream不能直接实现序列化,必须重载<<和>>操作符,只有重载完之后才可以按我们的要求实现序列化。 ——引用自 [ Monkey_Online]

闲话少说直接上实例,创建一个Qt控制台应用程序:

  1. @Freedom - qsampledata.h
  2. #ifndef QSAMPLEDATA_H
  3. #define QSAMPLEDATA_H
  4. #include <QObject>
  5. class QSampleData : public QObject
  6. {
  7. public:
  8. QSampleData();
  9. virtual ~QSampleData();
  10. QSampleData& operator=(const QSampleData &other);
  11. friend QDataStream& operator>>(QDataStream&, QSampleData&);
  12. friend QDataStream& operator<<(QDataStream&, QSampleData&);
  13. //定义的数据成员
  14. int m_nType;
  15. QString m_strName;
  16. };
  17. #endif
  1. @Freedom - qsampledata.cpp
  2. #include "qsampledata.h"
  3. #include <QDataStream>
  4. QSampleData::QSampleData()
  5. {
  6. m_nType = 0;
  7. m_strName = "";
  8. }
  9. QSampleData::~QSampleData()
  10. {
  11. }
  12. QSampleData& QSampleData::operator =(const QSampleData& other)
  13. {
  14. m_nType = other.m_nType;
  15. m_strName = other.m_strName;
  16. return *this;
  17. }
  18. QDataStream& operator>>(QDataStream& src, QSampleData& data)
  19. {
  20. /*
  21. 错误:C2679: 二进制“>>”: 没有找到接受“quint32”类型的右操作数的运算
  22. 解决方法:因为没有添加头文件<QDataStream>
  23. */
  24. src >> data.m_nType ;
  25. src >> data.m_strName;
  26. return src;
  27. }
  28. QDataStream& operator<<(QDataStream& out, QSampleData& data)
  29. {
  30. out << data.m_nType << data.m_strName;
  31. return out;
  32. }
  1. @Freedom - main.cpp
  2. /*Qt Serialization Qt串行化*/
  3. #include <QCoreApplication>
  4. #include <QFile>
  5. #include <QDataStream>
  6. #include <QTextStream>
  7. #include "ckdrawrectangle.h"
  8. int main(int argc, char *argv[])
  9. {
  10. QCoreApplication a(argc, argv);
  11. //控制台输出--将标准流封装为QTextStream对象
  12. QTextStream cin(stdin, QIODevice::ReadOnly);
  13. QTextStream cout(stdout, QIODevice::WriteOnly);
  14. QTextStream cerr(stderr, QIODevice::WriteOnly);
  15. //////////////////////////////////////////////////////
  16. QSampleData data;
  17. data.m_nType = 12;
  18. data.m_strName = "vic.MINg";
  19. QFile file("file.dat");
  20. //写入
  21. file.open(QIODevice::WriteOnly);
  22. QDataStream out(&file);
  23. out << data;
  24. file.close();
  25. //读取
  26. QSampleData readData;
  27. file.open(QIODevice::ReadOnly);
  28. QDataStream in(&file);
  29. in >> readData;
  30. file.close();
  31. //////////////////////////////////////////////////////
  32. cout << data.m_nType<<endl;
  33. cout << data.m_strName;
  34. cout.flush();
  35. return a.exec();
  36. }

更新

-*2015-11-09 第一次更新

http://blog.csdn.net/qq2399431200/article/details/49741715

QT 序列化/串行化/对象持久化的更多相关文章

  1. c# 处理串行化对象的版本变化

  2. Java 对象的串行化(Serialization)

    1.什么是串行化 对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复.我们把对象的这种能记录自己的状态以便将来再生的能力.叫作对象的持续性(pe ...

  3. JavaEE 对象的串行化(Serialization)

    什么情况下需要序列化 a)当你想把的内存中的对象写入到硬盘的时候:b)当你想用套接字在网络上传送对象的时候:c)当你想通过RMI传输对象的时候:再稍微解释一下:a)比如说你的内存不够用了,那计算机就要 ...

  4. java的串行化

    参考博客:Java 对象的串行化(Serialization) 1,什么是串行化 对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复.我们把对象 ...

  5. 【Java EE 学习 72 下】【数据采集系统第四天】【移动/复制页分析】【使用串行化技术实现深度复制】

    一.移动.复制页的逻辑实现 移动.复制页的功能是在设计调查页面的时候需要实现的功能.规则是如果在同一个调查中的话就是移动,如果是在不同调查中的就是复制. 无论是移动还是复制,都需要注意一个问题,那就是 ...

  6. C#基础知识回顾--串行化与反串行化

    串行化是指存储和获取磁盘文件.内存或其他地方中的对象.在串行化时,所有的实例数据都保存到存储介质上, 在取消串行化时,对象会被还原,且不能与其原实例区别开来.只需给类添加Serializable属性, ...

  7. C#--串行化与反串行化

    串行化是指存储和获取磁盘文件.内存或其他地方中的对象.在串行化时,所有的实例数据都保存到存储介质上,在取消串行化时,对象会被还原,且不能与其原实例区别开来.只需给类添加Serializable属性,就 ...

  8. PHP面向对象04_串行化

    oop04复习 2014-9-3 10:48:45 要点: --1.克隆对象 --2.__toString( ) --3. __call( ) --4.自动加载类 --5.对象串行化 1.克隆对象以及 ...

  9. MFC【6】文件I/O和串行化

    文件输入和输出(I/O)服务是所有操作系统的主要工作.Microsoft Windows提供了各种API函数用来读.写和操作磁盘文件.MFC将这些桉树和CFile类融合在面对对象的模型里.其中CFil ...

随机推荐

  1. 关于用什么作为dll版本号的思考

    作者:朱金灿 来源:http://blog.csdn.net/clever101 一个软件模块的版本如何维护呢?毫无疑问,它需要一个版本号.通过比对版本号就知道哪个高版本,哪个是低版本了.软件模块以d ...

  2. MVVM初步搭建应用

    MVVM模式:利用 prism Microsoft.Practices.Prism.dllWPF Interaction框架简介 添加Interactions库的引用.主要添加如下两个DLL: Mic ...

  3. 【b404】虫食算

    Time Limit: 1 second Memory Limit: 50 MB [问题描述] 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单 ...

  4. Android实现手机拍照功能

    一.布局文件main.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmln ...

  5. 用决策树模型求解回归问题(regression tree)

    How do decision trees for regression work? 决策树模型既可以求解分类问题(对应的就是 classification tree),也即对应的目标值是类别型数据, ...

  6. Druid 专题

    数据源配置: #datasource #Introductions: https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7 ...

  7. 类的XML序列化(XML Serialization)

    最近做的一个ASP.NET项目中,需要在一个页面中维护一个类的数组,在每次页面刷新的使其前一次的状态保持不变.开始错误的使用了static,导致了致命的共享错误.后来突然想起C#类能够使用XML序列化 ...

  8. class helper 可能是从 Delphi 2007 增加的新语法

    class helper 可能是从 Delphi 2007 增加的新语法, 因为感觉不太实用, 直到今天才测试了一下. 试过之后才知道: 挺有意思的! 基本功能就是修改已存在的类. Txxx = cl ...

  9. Spring 4 MVC+Apache Tiles 3 Example

    In this post we will integrate Apache Tiles 3 with Spring MVC 4, using annotation-based configuratio ...

  10. vue项目 下载表格 java后台返回的是信息流表格如何下载解决乱码

    主要是在请求参数后面加上{responseType: 'blob'}或者arrayBuffer this.$http.get(this.api.export, { params: this.info, ...