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

文章目录

    • 一、序列化与反序列化是什么?
      • 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 json

data = {"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 pickle

data = {"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 
#include 
#include 

using json = nlohmann::json;

int main() {
    json data;
    data["name"] = "Alice";
    data["age"] = 25;

    std::ofstream file("data.json");
    file << data.dump(4); // 格式化 JSON
    file.close();

    std::cout << "JSON 序列化完成" << std::endl;
    return 0;
}
C++ JSON 反序列化
#include 
#include 
#include 

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
  • 安全性 是序列化的关键,避免反序列化漏洞、数据篡改和信息泄露。

你可能感兴趣的:(杂记,java,c++,python)