Qt持久性对象进行序列化
转载: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持久性对象进行序列化相关推荐
- VC中对象的序列化与文件I/O
转自:http://huigezrx.blog.163.com/blog/static/32101652200911291140729/ 持久性和序列化 持久性是对象所有的保存和加载其状态数据的能力. ...
- java 对象怎么序列化,java对象序列化总结
java对象序列化小结 百度百科上介绍序列化是这样的: 序列化 (Serialization): 将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储 ...
- Binder相关面试总结(五):为什么Activity间传递对象需要序列化
前言 我们都知道进行Android 开发的时候,跳转到Activity和Fragment的时候,传递对象是通过Intent或者bundle 进行传递.当这个对象没有实现序列化的时候 当你通过Inetn ...
- 利用Qt元对象技术防止工厂模式下代码臃肿问题,QT 动态创建对象(第2种方法)
问题的提出: 近来要编写一个仿真液压.电力.机械的软件,如下为液压的: 可以看到液压图中很多液压元器件,这些元器件的id.名称等都是从json配置文件读取的,配置文件格式如下: {"Clas ...
- Java 对象的序列化
对象的序列化 概念 应用 涉及的接口和类 概念 对象序列化:将对象写到输出流中. 对象反序列化:从输入流中读取对象. 应用 调用远程方法:调用远程方法时,需要在客户机与服务器之间传递对象. 对象的持久 ...
- java图片序列化_Java中的强大武器——对象的序列化
原标题:Java中的强大武器--对象的序列化 所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象.这个过程也可以通过网络实现,可以先在Windows机器上创建一个对象, ...
- Java对象序列化详解6,Java对象的序列化与反序列化详解
把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种途径: Ⅰ . 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中 Ⅱ. 在网 ...
- Java对象XML序列化框架-Simple2.0
Java对象XML序列化框架-Simple2.0 Simple是一个XML序列化框架,一个Java 版本宽容的序列化框架,能够快速在Java 平台上开发XML.支持通过annotations完全配置化 ...
- Java基础学习总结——Java对象的序列化和反序列化
一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...
最新文章
- 不能定义声明dllimport_C#:多个声明的一个属性(DLLImport)
- 怎么修改与服务器的操作系统,怎么修改与服务器的操作系统
- Nacos: Namespace 和 Endpoint 在生产环境下的最佳实践
- OpenResty(nginx)操作redis的初步应用
- c统计多线程总时间_SQL Server处理器性能指标–第2部分–处理器:%用户时间,处理器:%特权时间,总时间和线程指标
- python软件下载3版本-python
- 图像卷积详细解释 常用卷积核解释说明
- tesseract box_使用Qt Box Editor在自定义数据集上训练Tesseract
- 20190131-JS - Promise使用详解--摘抄笔记
- 网站域名备案流程是什么样的?
- 【已解决】点击Import Package没有Environment与Effects等问题(从官网下载Environment等相关资源包)
- linux最新flash+player,Linux版Flash Player正式回归
- uni-app 对照设计稿还原不同屏幕像素适配(iPhone X)
- 中医-常用药食同源的食物功效作用
- 【Unity3D-UGUI应用篇】(六)屏幕自适应(多分配率适配)
- Django3创建数据库表模型及 Django 管理页面
- uniApp开发微信小程序减少包大小
- word 文档在左侧显示文档的目录结构的方法
- 万能乘法速算法大全_小学数学指算法、加法、减法、乘法、除法简便运算方法大全,收藏...
- 老牌硬件钱包Trezor用户遭钓鱼攻击,攻击者或已窃取大量账户信息