【序列化与反序列化详解】

文章目录

    • 一、序列化与反序列化是什么?
      • 1. 为什么需要序列化?
      • 2. 反序列化的作用
    • 二、常见的序列化格式
    • 三、不同编程语言的序列化与反序列化示例
      • 1. Python 的序列化与反序列化
        • JSON 序列化
        • Pickle 序列化(仅限 Python)
      • 2. Java 的序列化与反序列化
        • Java 序列化
        • Java 反序列化
      • 3. C++ 的序列化与反序列化(使用 JSON)
        • 安装 JSON 库
        • C++ JSON 序列化
        • C++ JSON 反序列化
    • 四、总结


一、序列化与反序列化是什么?

在计算机编程中,序列化(Serialization) 指的是将对象或数据结构转换成可以存储或传输的格式,比如 JSON、XML、二进制流等。反序列化(Deserialization) 则是将这些存储或传输的数据恢复成原来的对象或数据结构。

1. 为什么需要序列化?

序列化的主要作用如下:

  • 数据存储:将对象存储到文件、数据库或缓存中,以便后续使用。
  • 数据传输:在网络通信中,数据必须以字节流的形式进行传输,而对象不能直接在网络上传输,因此需要将其序列化。
  • 跨语言互操作:不同编程语言间的数据交换通常使用通用的序列化格式(如 JSON、XML、Protocol Buffers)。

2. 反序列化的作用

反序列化的作用就是将序列化后的数据恢复成对象,使其可在程序中继续使用。例如:

  • 读取存储的用户数据并恢复成对象供程序使用。
  • 接收网络请求时解析 JSON 数据并转换为可操作的对象。

二、常见的序列化格式

序列化格式有多种选择,每种格式都有其特点和适用场景。

序列化格式特点适用场景
JSON可读性强、轻量级、跨语言支持好Web API、配置文件、日志存储
XML结构清晰、可扩展、冗余较大旧系统兼容、大型数据交换
二进制(Pickle、Java 序列化)占用空间小、速度快、不可读内部数据存储、进程间通信
Protocol Buffers高效、跨平台、适合大规模数据交换分布式系统、RPC 通信

三、不同编程语言的序列化与反序列化示例

1. Python 的序列化与反序列化

Python 提供了多种序列化方式,包括 picklejsonmarshal 等,其中 json 是最常用的。

JSON 序列化
import jsondata = {"name": "Alice", "age": 25, "city": "Beijing"}# 序列化
json_str = json.dumps(data)
print("JSON 序列化结果:", json_str)# 反序列化
data_loaded = json.loads(json_str)
print("反序列化结果:", data_loaded)
Pickle 序列化(仅限 Python)
import pickledata = {"name": "Alice", "age": 25, "city": "Beijing"}# 序列化
with open("data.pkl", "wb") as f:pickle.dump(data, f)# 反序列化
with open("data.pkl", "rb") as f:data_loaded = pickle.load(f)print("Pickle 反序列化结果:", data_loaded)

2. Java 的序列化与反序列化

Java 使用 Serializable 接口进行序列化和反序列化。

Java 序列化
import java.io.*;class Person implements Serializable {private static final long serialVersionUID = 1L;String name;int age;Person(String name, int age) {this.name = name;this.age = age;}
}public class SerializeDemo {public static void main(String[] args) {try {Person p = new Person("Alice", 25);ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.ser"));out.writeObject(p);out.close();} catch (IOException e) {e.printStackTrace();}}
}
Java 反序列化
public class DeserializeDemo {public static void main(String[] args) {try {ObjectInputStream in = new ObjectInputStream(new FileInputStream("person.ser"));Person p = (Person) in.readObject();in.close();System.out.println("反序列化结果: " + p.name + ", " + p.age);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}

3. C++ 的序列化与反序列化(使用 JSON)

在 C++ 中,可以使用 nlohmann/json 库进行 JSON 序列化和反序列化。

安装 JSON 库
# Ubuntu
sudo apt-get install nlohmann-json3-dev
C++ JSON 序列化
#include <iostream>
#include <fstream>
#include <nlohmann/json.hpp>using json = nlohmann::json;int main() {json data;data["name"] = "Alice";data["age"] = 25;std::ofstream file("data.json");file << data.dump(4); // 格式化 JSONfile.close();std::cout << "JSON 序列化完成" << std::endl;return 0;
}
C++ JSON 反序列化
#include <iostream>
#include <fstream>
#include <nlohmann/json.hpp>using json = nlohmann::json;int main() {std::ifstream file("data.json");json data;file >> data;std::cout << "姓名: " << data["name"] << ", 年龄: " << data["age"] << std::endl;return 0;
}

四、总结

  • 序列化 是将对象转换为可存储或传输的格式,反序列化 是将数据恢复成对象。
  • 常见格式 包括 JSON(轻量)、XML(可扩展)、二进制(高效)、Protocol Buffers(高性能)。
  • 不同编程语言 提供了不同的序列化方案,如 Python json/pickle、Java Serializable、C++ nlohmann/json
  • 安全性 是序列化的关键,避免反序列化漏洞、数据篡改和信息泄露。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/903951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【单例模式】简介

目录 概念理解使用场景优缺点实现方式 概念理解 单例模式要保证一个类在整个系统运行期间&#xff0c;无论创建多少次该类的对象&#xff0c;始终只会有一个实例存在。就像操作系统中的任务管理器&#xff0c;无论何时何地调用它&#xff0c;都是同一个任务管理器在工作&#…

目标检测YOLO实战应用案例100讲- 无人机平台下露天目标检测与计数

目录 知识储备 基于YOLOv8改进的无人机露天目标检测与计数 一、环境配置与依赖安装 二、核心代码实现(带详细注释) 1. 改进YOLOv8模型定义(添加注意力机制) 2. 无人机视角数据增强(drone_augment.py ) 3. 多目标跟踪与计数(tracking_counter.py ) 4. 完整推理流…

【在Spring Boot中集成Redis】

在Spring Boot中集成Redis 依赖在application.yml中配置Redis服务地址创建Redis配置类缓存工具类使用 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency&…

计算机视觉——基于树莓派的YOLO11模型优化与实时目标检测、跟踪及计数的实践

概述 设想一下&#xff0c;你在多地拥有多个仓库&#xff0c;要同时监控每个仓库的实时状况&#xff0c;这对于时间和精力而言&#xff0c;都构成了一项艰巨挑战。从成本和可靠性的层面考量&#xff0c;大规模部署计算设备也并非可行之策。一方面&#xff0c;大量计算设备的购…

通信协议记录仪-产品规格书

以下是为 ​​通信协议记录仪(ProtoLogger Pro)​​ 的​​详细产品规格书​​,覆盖 ​​技术细节、场景需求、竞品差异化​​,确保可作为产品开发、市场营销及竞品分析的核心依据。 ​​通信协议记录仪产品规格书​​ ​​产品名称​​:ProtoLogger Pro(中文名称:蹲守…

python:sklearn 决策树(Decision Tree)

5. 决策树&#xff08;Decision Tree&#xff09; - 第5章 算法思想&#xff1a;基于信息增益&#xff08;ID3&#xff09;或基尼不纯度&#xff08;CART&#xff09;递归划分特征。 编写 test_dtree_1.py 如下 # -*- coding: utf-8 -*- """ 5. 决策树&…

【2-sat】2-sat算法内容及真题

A.2-sat简介 2-sat算法可以求解给定推出关系下的一种合法情况。题目中重常常&#xff0c;给定一些布尔变量A、B、C、D…&#xff0c;再给出一系列形如 B ⟶ A , C ⟶ D B \longrightarrow A , C \longrightarrow \neg D B⟶A,C⟶D的推出关系&#xff0c;询问使得所有推出关系…

【git】获取特定分支和所有分支

1 特定分支 1.1 克隆指定分支&#xff08;默认只下载该分支&#xff09; git clone -b <分支名> --single-branch <仓库URL> 示例&#xff08;克隆 某一个 分支&#xff09;&#xff1a; git clone -b xxxxxx --single-branch xxxxxxx -b &#xff1a;指定分支…

LWIP带freeRTOS系统移植笔记

以正点原子学习视频为基础的文章 LWIP带freeRTOS系统移植 准备资料/工程 1、lwIP例程1 lwIP裸机移植 工程 &#xff0c; 作为基础工程 改名为LWIP_freeRTOS_yizhi工程 2、lwIP例程6 lwIP_FreeRTOS移植 工程 3、freeRTO源码 打开https://www.freertos.org/网址下载…

组网技术知识点

1.port-isloate enable命令用于实现两个接口之间的二层数据隔离&#xff0c;三层数据互通。 2.交换机最多支持4096个VLAN&#xff0c;编号为1-4094 3.display bfd session all&#xff1a;查看BFD会话状态是否UP 4.RJ45通过双绞线连接以太网&#xff1b; AUI端口&#xff1…

Linux系统:进程程序替换以及相关exec接口

本节重点 理解进程替换的相关概念与原理掌握相关程序替换接口程序替换与进程创建的区别程序替换的注意事项 一、概念与原理 进程程序替换是操作系统中实现多任务和资源复用的关键机制&#xff0c;允许进程在运行时动态加载并执行新程序。 1.1 定义 进程程序替换是指用新程…

从此,K8S入门0门槛!

前言 当你想要入门K8S的时候&#xff0c;往往会被各种概念搞的晕乎乎的&#xff0c;什么API Server&#xff0c;Scheduler&#xff0c;Controller manager&#xff0c;Etcd&#xff0c;Pod&#xff0c;Kubelet&#xff0c;kube-proxy&#xff0c;deployment…… 哪怕你使用了…

[Python开发] 如何用 VSCode 编写和管理 Python 项目(从 PyCharm 转向)

在 Python 开发领域,PyCharm 一直是广受欢迎的 IDE,但其远程开发功能(如远程 SSH 调试)仅在付费版中提供。为了适应服务器部署需求,很多开发者开始将目光转向更加轻量、灵活且免费扩展能力强的 VSCode。本篇文章将详细介绍,从 PyCharm 转向 VSCode 后,如何高效搭建和管理…

处方流转平台权限控制模块设计(基于RBAC模型)

这是基于笔者的一些经验设计并加以完善的方案&#xff0c;仅供参考。 处方流转平台权限控制模块设计&#xff08;基于RBAC模型&#xff09; 1. 需求分析 处方流转平台需要严格的权限控制&#xff0c;确保&#xff1a; 患者隐私数据保护处方开具、审核、调配、发药等流程的合…

基于BM1684X+RK3588的智能工业视觉边缘计算盒子解决方案

智能工业视觉边缘计算终端技术方案书‌ ‌1. 产品概述‌ 1.1 产品定位 面向工业自动化场景的高性能AI视觉处理设备集成BM1684X&#xff08;8TOPS INT8&#xff09;AI加速芯片 RK3588&#xff08;6TOPS NPU&#xff09;异构计算支持工业级多相机接入、实时缺陷检测、高精度定…

软件工程中的 QFD

: 软件工程中的 QFD 在软件工程领域,随着市场竞争的加剧和用户需求的日益复杂,如何有效地将用户需求转化为软件产品,成为软件开发团队面临的重要挑战。而质量功能部署(Quality Function Deployment,QFD)作为一种强大的工具,为这一问题提供了有效的解决方案。 一、QF…

Vue2基础速成

一、准备工作 首先下载vue2的JavaScript库&#xff0c;并且命名为vue.min.js 下载链接&#xff1a;https://cdn.jsdelivr.net/npm/vue2&#xff08;若链接失效可去vue官网寻找&#xff09; CTRLS即可下载保存 文件目录结构 二、使用操作原生DOM与使用VUE操作DOM的便捷性比较…

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(14):かもしれません (~た・~ない)ほうがいいです

日语学习-日语知识点小记-构建基础-JLPT-N4阶段&#xff08;1&#xff14;&#xff09;&#xff1a;かもしれません &&#xff08;&#xff5e;た・&#xff5e;ない&#xff09;ほうがいいです 1、前言&#xff08;1&#xff09;情况说明&#xff08;2&#xff09;工程师…

传统银行服务和 区块链支付无缝融合的一种解决方案

Dragonfly Capital 的合伙人 Alex Pack 曾表示:“DeFi 的目标是重构全球银行体系,并打造开放且无须许可的经营环境。”在 DeFi 的金融世界中,加密资产架构在区块链上,通过各个协议实现资产之间的高效转移和价值的实时流通,如 Metamask 钱包的自托管,Uniswap 的资产交易,…

基于深度学习的毒蘑菇检测

文章目录 任务介绍数据概览数据处理数据读取与拼接字符数据转化标签数据映射数据集划分数据标准化 模型构建与训练模型构建数据批处理模型训练 文件提交结果附录 任务介绍 本次任务为毒蘑菇的二元分类&#xff0c;任务本身并不复杂&#xff0c;适合初学者&#xff0c;主要亮点…