转载:http://cool.worm.blog.163.com/blog/static/64339006200832642918250/

Mfc和Java中自定义类的对象都可以对其进行持久性保存,Qt持久性对象进行序列化当然也是必不可少的。
不过这个问题还真困扰了我很长时间……
Mfc通过重写虚函数Serialize()、Java则是所属的类必须实现java.io.Serializable或Externalizable接口完成、
Qt是怎么搞定这个事情那,QDataStream类:让我们不禁想起Mfc中的CAchive类、
Java中的java.io.ObjectOutputStream/ObjectInputStream类,分别提供了对象的序列化和反序列化功能。
现在还差什么了,那就是">>"和"<<"的实现了。
哈哈,c++中friend友员派上用场了。假设你的类是QSampleData,实现以下俩个函数就可以了
    #ifndef QT_NO_DATASTREAM
        friend QDataStream& operator>>(QDataStream&, QSampleData&);
        friend QDataStream& operator<<(QDataStream&, QSampleData&);
    #endif
当时这里不能忽略的事就是,QSampleData从QObject直接或间接派生,有个不带参数的构造函数,这都是老生常谈了~

一个例子,这也是必须的。

//比较懒,这次的注释就免了...
class QSampleData : public QObject

public:
    QChunnelData();
    virtual ~QChunnelData();
    QChunnelData& operator=(const QChunnelData &other);

#ifndef QT_NO_DATASTREAM
    friend QDataStream& operator>>(QDataStream&, QChunnelData&);
    friend QDataStream& operator<<(QDataStream&, QChunnelData&);
#endif 
    //定义的数据成员
    int m_nType;
    QString m_strName;
};

CSampleData::CSampleData()
{
    m_nType = 0;
    m_strName = "";
}
CSampleData::~CSampleData()
{
}
CSampleData::operator =(const CSampleData& other)
{
    m_nType = other.m_nType;
    m_strName = other.m_strName;
    return *this;
}
#ifndef QT_NO_DATASTREAM
QDataStream& operator>>(QDataStream& in, CSampleData& data)
{
    in >> data.m_nType >> data.m_strName;
    return in;
}
QDataStream& operator<<(QDataStream& out, CSampleData& data)
{
    out << data.m_nType << data.m_strName;
    return out;
}
#endif

这样就QFile、QByteArray...可以关联QDataStream类的对象,进行读写操作了。

QSampleData data;
data.m_nTpye = 12;
data.m_strName = "vic.MINg";
QFile file("file.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
out << data;
file.close();
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
in >> data;
file.close();

Qt持久性对象进行序列化相关推荐

  1. VC中对象的序列化与文件I/O

    转自:http://huigezrx.blog.163.com/blog/static/32101652200911291140729/ 持久性和序列化 持久性是对象所有的保存和加载其状态数据的能力. ...

  2. java 对象怎么序列化,java对象序列化总结

    java对象序列化小结 百度百科上介绍序列化是这样的: 序列化 (Serialization): 将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储 ...

  3. Binder相关面试总结(五):为什么Activity间传递对象需要序列化

    前言 我们都知道进行Android 开发的时候,跳转到Activity和Fragment的时候,传递对象是通过Intent或者bundle 进行传递.当这个对象没有实现序列化的时候 当你通过Inetn ...

  4. 利用Qt元对象技术防止工厂模式下代码臃肿问题,QT 动态创建对象(第2种方法)

    问题的提出: 近来要编写一个仿真液压.电力.机械的软件,如下为液压的: 可以看到液压图中很多液压元器件,这些元器件的id.名称等都是从json配置文件读取的,配置文件格式如下: {"Clas ...

  5. Java 对象的序列化

    对象的序列化 概念 应用 涉及的接口和类 概念 对象序列化:将对象写到输出流中. 对象反序列化:从输入流中读取对象. 应用 调用远程方法:调用远程方法时,需要在客户机与服务器之间传递对象. 对象的持久 ...

  6. java图片序列化_Java中的强大武器——对象的序列化

    原标题:Java中的强大武器--对象的序列化 所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象.这个过程也可以通过网络实现,可以先在Windows机器上创建一个对象, ...

  7. Java对象序列化详解6,Java对象的序列化与反序列化详解

    把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种途径: Ⅰ . 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中 Ⅱ.  在网 ...

  8. Java对象XML序列化框架-Simple2.0

    Java对象XML序列化框架-Simple2.0 Simple是一个XML序列化框架,一个Java 版本宽容的序列化框架,能够快速在Java 平台上开发XML.支持通过annotations完全配置化 ...

  9. Java基础学习总结——Java对象的序列化和反序列化

    一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...

最新文章

  1. 不能定义声明dllimport_C#:多个声明的一个属性(DLLImport)
  2. 怎么修改与服务器的操作系统,怎么修改与服务器的操作系统
  3. Nacos: Namespace 和 Endpoint 在生产环境下的最佳实践
  4. OpenResty(nginx)操作redis的初步应用
  5. c统计多线程总时间_SQL Server处理器性能指标–第2部分–处理器:%用户时间,处理器:%特权时间,总时间和线程指标
  6. python软件下载3版本-python
  7. 图像卷积详细解释 常用卷积核解释说明
  8. tesseract box_使用Qt Box Editor在自定义数据集上训练Tesseract
  9. 20190131-JS - Promise使用详解--摘抄笔记
  10. 网站域名备案流程是什么样的?
  11. 【已解决】点击Import Package没有Environment与Effects等问题(从官网下载Environment等相关资源包)
  12. linux最新flash+player,Linux版Flash Player正式回归
  13. uni-app 对照设计稿还原不同屏幕像素适配(iPhone X)
  14. 中医-常用药食同源的食物功效作用
  15. 【Unity3D-UGUI应用篇】(六)屏幕自适应(多分配率适配)
  16. Django3创建数据库表模型及 Django 管理页面
  17. uniApp开发微信小程序减少包大小
  18. word 文档在左侧显示文档的目录结构的方法
  19. 万能乘法速算法大全_小学数学指算法、加法、减法、乘法、除法简便运算方法大全,收藏...
  20. 老牌硬件钱包Trezor用户遭钓鱼攻击,攻击者或已窃取大量账户信息

热门文章

  1. 关于url传参中文乱码问题
  2. Yii2所提倡的配置管理方案
  3. AutoIt: send 命令 VS ControlClick的使用
  4. HDOJ 1160 FatMouse's Speed
  5. 【Scala】Scala的安装以及创建Scala项目的详细步骤
  6. 软件测试—软件测试基础知识—测试用例设计的方法判定表和因果图
  7. BurpSuite下载CA证书
  8. python01_Python编码环境安装与基本语法
  9. 数据库-Windows启动和停止mysql
  10. tableau两个不同的图合并_【书稿摘要】Tableau地图函数(下)