【序列化與反序列化詳解】

文章目錄

    • 一、序列化與反序列化是什么?
      • 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.pswp.cn/news/903951.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903951.shtml
英文地址,請注明出處:http://en.pswp.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;主要亮點…