序列化与反序列化

devtools/2024/12/23 7:55:53/

什么是序列化和反序列化?

1. 序列化(Serialization)

序列化 是将对象或数据结构转换为可以存储或传输的格式的过程。序列化后,数据可以被保存到文件、数据库、或通过网络发送到其他设备。在网络通信或数据持久化的场景中,序列化是一项常见的操作。

例如,应用程序中的复杂对象(如自定义的类对象或数据结构)在序列化后可以转换为二进制格式、XML、JSON 等格式,然后通过网络传输或存储在磁盘中。

2. 反序列化(Deserialization)

反序列化 是序列化的逆过程。它是将存储或传输的格式化数据重新转换为程序中的对象或数据结构的过程。通过反序列化,程序可以从文件、网络中读取数据,并将其恢复成内存中的实际对象。

序列化与反序列化的应用场景

序列化和反序列化广泛用于以下场景:

  1. 数据持久化:将对象的状态保存到文件中,便于以后恢复,例如游戏的存档或应用程序的设置。
  2. 网络传输:将对象序列化成 JSON、XML 等格式,通过网络传输到远程服务器或客户端。
  3. 缓存数据:将复杂的对象序列化后保存到缓存中,便于后续快速读取。

序列化与反序列化的例子

例子1:JSON 格式的序列化和反序列化

假设我们有一个简单的学生对象,包括 nameagesex 三个属性。我们可以通过序列化将该对象转换为 JSON 字符串,然后通过反序列化将 JSON 字符串还原为一个对象。

JSON 序列化和反序列化的示例代码(基于 Qt)

构建一个 student 对象,并将其序列化为 JSON:

#include <QJsonObject>
#include <QJsonDocument>
#include <QByteArray>
#include <QDebug>int main() {// 创建一个简单的学生对象QJsonObject studentObject;studentObject["name"] = "John";studentObject["age"] = 21;studentObject["sex"] = "Male";// 将对象序列化为 JSON 文档QJsonDocument jsonDoc(studentObject);QByteArray jsonData = jsonDoc.toJson();// 打印 JSON 字符串qDebug() << jsonData;return 0;
}

输出的序列化结果:

 

{ "name": "John", "age": 21, "sex": "Male" }

将 JSON 字符串反序列化为对象:
#include <QJsonObject>
#include <QJsonDocument>
#include <QByteArray>
#include <QDebug>int main() {// 模拟从文件或网络收到的 JSON 字符串QByteArray jsonData = R"({"name": "John", "age": 21, "sex": "Male"})";// 将 JSON 字符串反序列化为 QJsonObjectQJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);QJsonObject studentObject = jsonDoc.object();// 提取属性并打印QString name = studentObject["name"].toString();int age = studentObject["age"].toInt();QString sex = studentObject["sex"].toString();qDebug() << "Name:" << name;qDebug() << "Age:" << age;qDebug() << "Sex:" << sex;return 0;
}
反序列化后的输出:
 

Name: John Age: 21 Sex: Male

总结:
  • 序列化:将对象或数据结构转换为 JSON、XML 或二进制格式,便于存储和传输。
  • 反序列化:将存储或传输的格式化数据转换为程序中的对象,便于后续操作。

通过 QJsonDocumentQJsonObjectQJsonArray,可以方便地在 Qt 中实现 JSON 数据的序列化和反序列化操作,适用于数据存储、网络传输等场景。


http://www.ppmy.cn/devtools/122260.html

相关文章

面试题之- null和undefined的区别

前言 首先undefined和null都是基本数据类型&#xff0c;这两个基本数据类型分别都只有一个值&#xff0c;就是undefined和null。 undefined代表的含义是未定义&#xff0c;null代表的的含义是空对象&#xff0c;一般变量声明了但是还有没有定义的时候会返回undefined&#xf…

IntelliJ IDE 插件开发 | (十三)自定义项目脚手架(下)

系列文章 本系列文章已收录到专栏&#xff0c;交流群号&#xff1a;689220994&#xff0c;也可点击链接加入。 前言 在上一篇文章中介绍了如何在 IDEA 中自定义项目脚手架&#xff0c;本文将介绍如何在WebStorm、PyCharm、CLion等其它 IntelliJ 主流平台中如何自定义项目脚手…

数字通信中不同信道类型对通信系统性能影响matlab仿真分析,对比AWGN,BEC,BSC以及多径信道

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…

用HTML5+CSS+JavaScript庆祝国庆

用HTML5CSSJavaScript庆祝国庆 中华人民共和国的国庆日是每年的10月1日。 1949年10月1日&#xff0c;中华人民共和国中央人民政府成立&#xff0c;在首都北京天安门广场举行了开国大典&#xff0c;中央人民政府主席毛泽东庄严宣告中华人民共和国成立&#xff0c;并亲手升起了…

QT系统学习篇(3)- Qt开发常用算法及控件原理

一、Qt中 Qt框架中和模块提供一些算法和常用函数 比如 double d1-59.6,d292.5;double d3qAbs(d1);double d4qMax(d1,d2);qDebug()<<"d3"<<d3<<"d4"<<d4<<endl;二、Qt窗口及控件原理设计 理解Qt窗口的生成、属性 1、Qt窗口…

Docker 安装与配置单机多磁盘 MinIO:高效存储解决方案

Docker 安装与配置单机多磁盘 MinIO&#xff1a;高效存储解决方案 文章目录 Docker 安装与配置单机多磁盘 MinIO&#xff1a;高效存储解决方案一 创建网络二 单机部署三 访问 MinIO Console 本文详述如何通过 Docker Compose 部署单机多磁盘的 MinIO 存储解决方案。首先&#x…

uniapp修改uni-ui组件样式(对微信小程序/H5有效,vue3)

寻找要修改的样式 使用开发者工具找到具体要修改的class类名 修改 <style lang"scss">//.nav为上一级的class.nav::v-deep .uni-navbar--border {border-bottom-style: none !important;} </style>完整代码 <template><view><uni-na…

Linux驱动开发——新字符设备驱动开发

文章目录 1 概述2 新字符设备驱动原理2.1 分配和释放设备号2.2 新字符设备注册方法 3 自动创建设备节点3.1 mdev机制3.2 创建和删除类3.3 创建设备 4 设置文件私有数据5 实验程序编写 系列文章&#xff1a; Linux驱动开发——字符设备驱动开发 Linux驱动开发——LED驱动开发 1 …