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接口,这样的类的对象才能 ...
随机推荐
- 怎么取消 Windows Server 2012 RDP 限制每个用户只能进行一个会话
在 Windows Server 2008 / 2008 R2 上,如果希望多个远程用户使用同一个账号同时访问服务器的 Remote Desktop(RDP),只需通过管理工具-远程桌面下的“远程桌面 ...
- 使用OFFSET-FETCH进行数据过滤
TOP的工业标准版 OFFSET-FETCH OFFSET 用来设置跳过行的数量 FETCH 用来设置检索多少行,必须要排序才能用,SQL Server 2012的新语法 从语意的角度来讲如果要跳开几 ...
- 解決 centos中-bash: vim: command not found
用centos 的主机的時候, 用 vim 时出现 -bash: vim: command not found. 只能使用 vi. 那么如何安裝 vim 呢? 输入 rpm -qa|grep vim ...
- NOIP2015酱油记
day0 坐动车到广州..下午就在酒店颓... day1 早上6:30起床...大概8:00到六中..ZSJZ众貌似很晚才到..毕竟他们酒店就在学校门口(真的就刚刚好是门口...),大概8:15进去机 ...
- 第五节 Code 128 码
128码开始於1981年推出,是一种长度可变.连续性的字母数字条码.与其他一维条码比较起来,128码是较为复杂的条码系统,而其所能支援的字元也相对地比其他一维条码来得多,又有不同的编码方式可供交互运用 ...
- Windows XP硬盘安装Ubuntu 12.04双系统图文详解
Windows XP硬盘安装Ubuntu 12.04双系统图文详解 Ubuntu 12.04 LTS版本于2012年4月26日发布,趁着五一放假,赶紧在自己的Windows XP的电脑上安装下Ubun ...
- PencilDraw: 用简化的C语言画图!
最近做的一个东西,不过功能还不是太完善,而且界面极丑.慢慢改进吧. 点这里打开!
- android 修改背景色(转)
修改为黑底白字 修改AndroidManifest.xml把android:theme="@style/AppTheme" 修改为android:theme="@andr ...
- 11997 - K Smallest Sums(优先队列)
11997 - K Smallest Sums You’re given k arrays, each array has k integers. There are kk ways to pick ...
- 关于 javascript event flow 的一个bug
[1]描述了firefox,safari 有一个bug和DOM 3 规范不一致:在event.currentTarget等于event.target的时候(即event flow处于target ph ...