qt序列化自定义对象_Qt 自定义序列化

本文详细介绍了如何在Qt中使用QDataStream类为自定义的复杂数据结构进行序列化和反序列化操作,包括结构体RectMetaInfo和ProjectInfo的序列化方法,以及处理QMap容器的序列化技巧。
摘要由CSDN通过智能技术生成

序列化是信息传输和持久化的基石,用于网络传输的序列化,主流是JSON和XML,而持久化保存,则一般是二进制文件,在Qt中,提供了QDataStream类为我们的程序提供了读写二进制数据的能力。

QDataStream类实现了序列化C++的基本数据类型的功能,比如char,short,int,char* 等等,不但如此还可以直接序列化 QMap ,QList之类的容器(需要保证容器内的元素是基本类型元素)。但是往往程序中包含了复杂的数据结构,此时就不能直接进行序列化了。因此我们需要将复杂数据类型分解成独立的基本数据类型分别进行序列化。

typedef structProjectInfo{

QString projectName;

QString imgPath;

QString annotationMeta;

QString createTime;intcurrentImgIndex;

QMap>markCollection;

} Project;

Q_DECLARE_METATYPE(ProjectInfo);

typedefstructRectMetaInfo{

QString text;

qreal x;

qreal y;

qreal w;

qreal h;

} RectMeta;

Q_DECLARE_METATYPE(RectMetaInfo);

上述代码包含了两个结构体,

其中一个结构体RectMetaInfo中,全部都是基本类型,

而另外一个结构体ProjectInfo,则包含了基本类型和复杂的容器类型

此时我如果直接序列化结构体ProjectInfo,显然是行不通的,因此我们需要逐步分解序列化。

首先结构体ProjectInfo包含了结构体RectMetaInfo,那么先序列化RectMetaInfo

由于RectMetaInfo中都是基本类型,所以序列化比较简单。需要注意的是序列化的顺序要和反序列化的数据的顺序保持一致

//重载序列化

inline QDataStream &operator<

{

output<< metaInfo.text << metaInfo.x << metaInfo.y << metaInfo.w <

}//重载反序列化

inline QDataStream &operator>>(QDataStream &input , RectMetaInfo &metaInfo)

{

input>> metaInfo.text >> metaInfo.x >> metaInfo.y >> metaInfo.w >>metaInfo.h;returninput;

}

重载了结构体RectMetaInfo的序列化和反序列化,接下来就要重载结构体ProjectInfo。

由于ProjectInfo包含了QMap容器元素,因此我们需要一个将QMap的元素个数保存起来(添加附加信息)

//重载序列化

inline QDataStream &operator<

{

output<< pj.projectName << pj.imgPath << pj.annotationMeta << pj.createTime < 可以直接被序列化(QMap能否被直接序列化,要看QMap中的类型是否是基本类型,如果是,就可以直接序列化),第一个参数表

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值