Qt持久性对象进行序列化(同时比较了MFC与Java的方法)
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();
http://cool.worm.blog.163.com/blog/static/64339006200832642918250/
Qt持久性对象进行序列化(同时比较了MFC与Java的方法)的更多相关文章
- Qt持久性对象进行序列化
Mfc和Java中自定义类的对象都可以对其进行持久性保存,Qt持久性对象进行序列化当然也是必不可少的.不过这个问题还真困扰了我很长时间……Mfc通过重写虚函数Serialize().Java则是所属的 ...
- C#对象先序列化然后反序列化时间丢失八小时的问题
把对象JSON序列化,然后反序列化后发现时间少了八小时.因为在东八区,所以序列的时候按照1970-01-01:08:00:00为基数取得差值,而反序列化的时候以1970-01-01:00:00:00作 ...
- Java基础学习总结——Java对象的序列化和反序列化
一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...
- IO(四)----对象的序列化
对象的序列化: 将内存中的对象直接写入到文件设备中. 对象的反序列化: 将文件设备中持久化的数据转换为内存对象. 自定义类只要实现了Serializable接口,便可以通过对象输入输出流对对象进行 ...
- Java对象的序列化和反序列化
对象的序列化是指将对象转换为字节序列的过程 对象的反序列化是指将字节序列恢复对象的过程 主要有两种用途: 1.把对象的字节序列永久地保存在硬盘上,通常放在一个文件中. 2.在网络上传输对象的字节序列. ...
- Java对象的序列化
1.概念 序列化:把Java对象转换为字节序列的过程. 反序列化:把字节序列恢复为Java对象的过程. 2.用途 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个 ...
- C# 对象的序列化与反序列化 (DataContractJsonSerializer)
项目引用 System.Runtime.Serialization.dll 添加命名空间 using System.Runtime.Serialization.Json; 1.序列化对象,得到Json ...
- java对象的序列化与反序列化使用
1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化与反序列化 我们知道,当两个进程进 ...
- java中对象的序列化和反序列化
[对象的序列化和反序列化 ] 1.定义:序列化--将对象写到一个输出流中.反序列化则是从一个输入流中读取一个对象.类中的成员必须是可序列化的,而且要实现Serializable接口,这样的类的对象才能 ...
随机推荐
- java结构与算法之冒泡排序
一.什么是冒泡排序:冒泡排序是在从相邻两个数之间进行比较,这里将前面一个值定义为before,后面一个值定义为after:当before>after时i,交换他们的值,如果before<a ...
- windows上的tomcat配置
下载及安装 首先要安装JDK:jdk-7windows-x64.zip 再安装tomcat:apache-tomcat-7.0.23-windows-x64.zip 配置环境变量: CATALIN ...
- linux shell awk 流程控制语句(if,for,while,do)详细介绍
在linux awk的 while.do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出.break中断当前正在执行的循环并跳到循环 ...
- Java学习之IO之File类一
File的操作 package com.gh.file; import java.io.File; import java.io.IOException; /** * File操作 * @author ...
- Buy Tickets(线段树)
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 16607 Accepted: 8275 Desc ...
- SRBF Lighting
SRBF的全称是Spherical Radial Basis Function,笔者擅自翻译为球面放射基底函数.由于SRBF并不怎么出名,相对来说,SH(Spherical Harmonic)球 ...
- android FragmentPagerAdapter的“标准”配置
private class ImagePagerAdapter extends FragmentPagerAdapter { public List<ImageItem> ...
- postgres-xc手册生成方法
步骤 检测编译环境 安装编译工具 编译 以上只在linux环境当中进行,本人所用系统ubuntu15.04 检测编译环境 在posgtgresql目录下运行./configure,并安装需要安 ...
- Week10(11月11日):一个激动的日子
Part I:提问 =========================== 请回答视图和控制器传递数据的方法. Part II:案例学习 =========================== Mu ...
- redis(四)redis与Mybatis的无缝整合让MyBatis透明的管理缓存
redis的安装 http://liuyieyer.iteye.com/blog/2078093 redis的主从高可用 http://liuyieyer.iteye.com/blog/207809 ...