QDataStream实现自定义对象序列化
来源:互联网 发布:淘宝买家信誉规则 编辑:程序博客网 时间:2024/05/16 07:20
项目需求将用户上一次配置信息保存到硬盘上,以便下次用户直接加载。我是讲用户配置信息作为一个类存在的,研究了2天QT平台上的对象序列化问题。C++的序列化问题在VC平台上实现比较简单。Java的序列化问题只需要实现seriable接口即可。网上查了几个QT相关的例子,发现各种错误,最大的错误就是不能编译成功。在QT平台上使用QDataStream作为序列化的输入输出流,http://www.kuqin.com/qtdocument/qdatastream.html。文档里使用Q_INT32作为基本数据类型,但是我在QT平台上没有找到Q_INT32的类型,只有qint32,必须使用qint32代替int可以实现基本数据类型int的序列化。
我对对象序列化问题的理解是:将对象分解为平台能解析的基本数据类型,然后对基本数据类型进行写入操作。上例中的结构体XX为测试对象中含有结构体的序列化方法。对于对象中含有数组的情况,思路为:在保存对象磁盘文件中增加一个cout记录数组的元素个数(一维数组一个,多维数组记录多个),然后将数组的元素按行顺序写入到磁盘文件中,读取的时候则先读取数组的维数和元素个数,然后动态申请内存,将元素写入到内存中,将内存首地址赋值到对象的数组地址(即数组名)。对数组还没有进行测试。
这2天浪费时间都花在对平台的基本数据类型的修正中,比如使用QDataStream 将int直接写入肯定是不行,使用qint32可以。
/TEST测试类该类的友元函数 重载》 《
#ifndef TEST_H#define TEST_H#include <QString>typedef struct xx{ int x; int y;}XX;class Test{public: Test(); int age; QString name; XX aa; friend QDataStream& operator<<(QDataStream&,Test&); friend QDataStream& operator>>(QDataStream&,Test&);};#endif // TEST_H
//test的实现类,在友元函数负责将test对象的分解为基本数据类型,然后写入QDataStream流中。
#include "test.h"#include "qdatastream.h"Test::Test(){}QDataStream& operator <<(QDataStream& stream,Test& test){ qint32 tmp = test.age; qint32 x = test.aa.x; qint32 y = test.aa.y; stream<<tmp<<test.name<<x<<y; return stream;}QDataStream& operator >>(QDataStream& stream,Test& test){ qint32 tmp; qint32 x; qint32 y; XX xx; stream>>tmp>>test.name>>x>>y; xx.x = x; xx.y =y; test.age = tmp; test.aa = xx; return stream;}
主函数文件,测试是否写入成功,并成功读取磁盘文件。
Test test,out; test.age = 10; test.name="test"; test.aa.x = 5; test.aa.y = 6; QFile file("/d.dat"); file.open(QIODevice::ReadWrite); QDataStream stream(&file); stream<<test; file.close(); QFile file1("/d.dat"); file1.open(QIODevice::ReadWrite); QDataStream stream1(&file1); stream1>>out; file1.close();
我对对象序列化问题的理解是:将对象分解为平台能解析的基本数据类型,然后对基本数据类型进行写入操作。上例中的结构体XX为测试对象中含有结构体的序列化方法。对于对象中含有数组的情况,思路为:在保存对象磁盘文件中增加一个cout记录数组的元素个数(一维数组一个,多维数组记录多个),然后将数组的元素按行顺序写入到磁盘文件中,读取的时候则先读取数组的维数和元素个数,然后动态申请内存,将元素写入到内存中,将内存首地址赋值到对象的数组地址(即数组名)。对数组还没有进行测试。
这2天浪费时间都花在对平台的基本数据类型的修正中,比如使用QDataStream 将int直接写入肯定是不行,使用qint32可以。
0 0
- QDataStream实现自定义对象序列化
- 使用对象序列化实现自定义配置文件管理
- axis自定义对象序列化
- axis 自定义对象序列化
- QDataStream传递自定义的数据类型
- 基于QTcpSocket和QTcpServer的Tcp通讯以及QDataStream序列化数据
- 实现javascript对象序列化
- Android对象序列化实现
- 基于Axis的自定义对象序列化
- 基于Axis的自定义对象序列化
- 基于Axis的自定义对象序列化
- axis client 自定义对象序列化
- Qt中序列化自定义对象
- QDataStream 运算符重载发送自定义数据结构
- .NET 插件系统框架设计(二) 使用对象序列化实现自定义配置文件管理
- Flex 序列化自定义类 解决 sharedObject 保存自定义对象
- Flex 序列化自定义类 解决 sharedObject 保存自定义对象
- 自定义序列化 ISerializable 的实现
- RANSAC算法详解
- jtextpane的使用方法
- PLSQL如何远程连接ORACLE
- android 发送验证码,显示倒计时
- android4.0触摸屏(touchscreen)以及屏幕按键驱动解析
- QDataStream实现自定义对象序列化
- Spring的事务管理难点剖析(2):应用分层的迷惑
- Nginx配置文件nginx.conf中文详解
- Android处理图片OOM的若干方法小结
- C++_简单C++程序
- ActionBar 修改title 的字体 大小和颜色
- Java 6 JVM参数选项大全(中文版)
- Linux企业级开发技术(7)——libevent企业级开发之锁和线程
- 数据结构之堆栈