文章目录
- 一、序列化与反序列化是什么?
- 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
。 - 安全性 是序列化的关键,避免反序列化漏洞、数据篡改和信息泄露。