序列化与反序列化

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

1. 序列化(Serialization)

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

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

2. 反序列化(Deserialization)

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

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

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

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

序列化与反序列化的例子

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

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

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

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

cpp 复制代码
#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 字符串反序列化为对象:
cpp 复制代码
#include <QJsonObject>
#include <QJsonDocument>
#include <QByteArray>
#include <QDebug>

int main() {
    // 模拟从文件或网络收到的 JSON 字符串
    QByteArray jsonData = R"({"name": "John", "age": 21, "sex": "Male"})";

    // 将 JSON 字符串反序列化为 QJsonObject
    QJsonDocument 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 数据的序列化和反序列化操作,适用于数据存储、网络传输等场景。

相关推荐
qeen876 小时前
【数据结构】自平衡二叉搜索树各种旋转算法原理解析及AVL树的C++实现
数据结构·c++·算法
Augustzero7 小时前
为什么线程不能说睡就睡?看懂等待与唤醒机制
c++·后端
程序员与背包客_CoderZ7 小时前
Linux D-Bus通信协议详解:从入门到C/C++编码实战
linux·服务器·c语言·c++·嵌入式硬件·嵌入式软件·dbus
冻柠檬飞冰走茶7 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
wangchen_07 小时前
C++正则表达式
开发语言·c++·正则表达式
嵌入式阿蔡8 小时前
HAL库 vs LL库 vs 寄存器:到底用哪个?
c语言·stm32·单片机·嵌入式硬件·嵌入式实时数据库
Yyyyyy~8 小时前
【C】C语言常见概念
c语言
嵌入式阿蔡10 小时前
CAN总线入门:从协议帧到STM32实战
c语言·stm32·单片机·嵌入式硬件·嵌入式实时数据库
码匠许师傅10 小时前
【C++ 面试真题】聊聊 C++ 中的 lambda 表达式
java·c++·面试
依然鸣10 小时前
PTA团体程序设计天梯赛L1真题讲解L1-085-088
数据结构·c++·经验分享·算法·深度优先·pat考试