文章目錄
- 一、序列化與反序列化是什么?
- 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 提供了多種序列化方式,包括 pickle
、json
、marshal
等,其中 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
、JavaSerializable
、C++nlohmann/json
。 - 安全性 是序列化的關鍵,避免反序列化漏洞、數據篡改和信息泄露。