C++ / QT 对象序列化(Object Serialization)的实现
来源:互联网 发布:网络通信协议基础 编辑:程序博客网 时间:2024/05/02 02:41
对象序列化,
简单地讲就是把程序运行时保存在内存中的某个对象,整个抽取出来,从而可以实现将这个对象进行持久性保存(如普通文件存储、数据库),或者网络传输。
今天在一个QT项目上刚好有这样的一个需求,网上也看了一些资料,主要的思想就是就是利用QDataStream,重载其<< 和 >>
操作符实现(虽然重载的原因是因为 QDataStream << 和 >>
操作符只支持C++内置的基本数据类型,但我觉得实际上,重载操作符过后本质上并没有什么变化,因为你必须去实现operator重载的内部实现,而在实现的过程中,依然必须以基本数据类型为单位进行写入)。现在将QT的测试代码整理出来:
DataClass.h
#ifndef DATACLASS_H#define DATACLASS_H#include <QDataStream>#include <QObject>#include <QtCore>#include <queue>using namespace std;class DataClass : public QObject{ Q_OBJECTpublic: explicit DataClass(QObject *parent = 0);public: int id;//数据项 QString name;//数据项 queue<int> que;//数据项public: friend QDataStream &operator<<(QDataStream & , const DataClass &); friend QDataStream &operator>>(QDataStream & , DataClass &);signals:public slots:};#endif // DATACLASS_H
DataClass.cpp
#include "dataclass.h"DataClass::DataClass(QObject *parent) : QObject(parent){}QDataStream & operator<<(QDataStream & output, const DataClass &obj){ output << obj.id <<obj.name; queue<int> tmpQue = obj.que; while(!tmpQue.empty()) { output<<tmpQue.front(); tmpQue.pop(); } return output ;}QDataStream & operator>>(QDataStream & input, DataClass & obj){ input >> obj.id >>obj.name; while(!input.atEnd()) { int elem; input >> elem; obj.que.push(elem); } return input;}
MainWindow 序列化按钮点击事件:
void MainWindow::on_pushButton_clicked(){ //序列化按钮单击事件 DataClass obj; obj.id = 888; obj.name = "tobin"; obj.que.push(999); obj.que.push(888); obj.que.push(777); QFile f("D:/serialization.txt"); if(!f.open(QIODevice::WriteOnly | QIODevice::Text)) { qDebug() << "文件打开失败!" ; return; } QDataStream ds(&f); ds << obj ; f.close(); qDebug()<<"序列化保存成功!";}
MainWindow 反序列化 按钮点击事件:
QFile f("D:/serialization.txt"); if(!f.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "文件打开失败!" ; return; } QDataStream ds(&f); DataClass obj; while(!ds.atEnd()) { ds >> obj; } qDebug()<<"反序列化完成,obj的id为"<<obj.id<<" name 为:"<<obj.name; queue<int>tmpQue = obj.que; while(!tmpQue.empty()) { qDebug()<<tmpQue.front(); tmpQue.pop(); } f.close();
运行效果:
0 0
- C++ / QT 对象序列化(Object Serialization)的实现
- 对象序列化(Object Serialization)
- Java对象序列化(Object Serialization)
- Java对象序列化 Object Serialization
- android-java对象序列化Object serialization
- Java源码——对象序列化(对象的存储及读取)(Object Serialization)
- 利用boost的serialization库实现c++对象的序列化与反序列化
- Qt中对象序列化的实现
- java中对象序列化(Serialization)的注意事项
- Java的序列化(Serialization)
- Java 的序列化 (Serialization)
- 对象序列化之Boost.Serialization
- 序列化(Serialization)一个对象
- #705 – 拖拽可序列化类型的数据(Dragging a Custom Object Using Serialization as Format)
- 浅析Java Object Serialization与 Hadoop 序列化
- 浅析Java Object Serialization与 Hadoop 序列化
- JHTP小结_第十五章_文件、流和对象序列化(Files, Streams, and Object Serialization)
- JHTP自测题_第十五章_文件、流和对象序列化(Files, Streams, and Object Serialization)
- C#的post请求
- 高精度减法
- Unity3d DLL脚本通用解密方法
- js代码判断浏览器类型(chrom\IE\firfox\safari\)opera)的类型
- hdu 1016Prime Ring Problem
- C++ / QT 对象序列化(Object Serialization)的实现
- PG和Oracle的差异
- 【转载】Best Practices for Speeding Up Your Web Site
- Web 通信 之 长连接、长轮询(long polling)
- 算法竞赛入门经典 第二版 习题5-2 Ducci序列 Ducci Sequence uva1594
- OpenMP并行程序设计之常用子句使用介绍(二)
- 算法学习-连续子数组求和最大值
- 优化流程分析
- 爬虫模拟登陆_带验证码