0Pricing
Learn Rust Coding · 课时

序列化与反序列化

派生宏

序列化与反序列化 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 4 节课。

什么是 Serde?

Serde(SERialize/DEserialize)是 Rust 用于在 JSON、YAML 等格式之间转换数据结构的框架。

  • 与格式无关的核心,加上针对不同格式的 crate
  • 由派生宏驱动

添加 serde

使用 derive 功能添加 serde,并添加诸如 serde_json 这样的格式 crate。这会修改 Cargo.toml。

[dependencies]
serde = { version = "1", features = ["derive"] }
serde_json = "1"

派生特征

为结构体添加 #[derive(Serialize, Deserialize)] 注解,即可使其支持转换。每个字段本身也必须支持序列化。

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct User {
    id: u32,
    name: String,
}

Serialize 表示转换为某种格式

Serialize 会将值转换为某种格式的字节或文本。结构体本身并不知道使用哪种格式,而是由格式 crate 决定。

Deserialize 表示从某种格式转换

Deserialize 会将文本或字节解析回 Rust 值,同时验证类型和必需字段。

手动模拟序列化

为了帮助您建立直观理解,下面是一个为简单结构体手写的序列化器。serde 会为您生成类似这样的代码。

struct User { id: u32, name: String }

fn serialize(u: &User) -> String {
    format!("id={};name={}", u.id, u.name)
}

fn main() {
    let u = User { id: 7, name: "Alice".to_string() };
    println!("{}", serialize(&u));
}

手动模拟反序列化

下面是相反的过程:将文本解析回结构体。serde 生成的代码可以稳健地处理各种格式。

struct User { id: u32, name: String }

fn deserialize(s: &str) -> User {
    let parts: Vec<&str> = s.split(',').collect();
    let id = parts[0].parse().unwrap();
    let name = parts[1].to_string();
    User { id, name }
}

fn main() {
    let u = deserialize("42,Bob");
    println!("{} {}", u.id, u.name);
}

为枚举派生实现

枚举同样支持此功能。默认情况下,每个变体会按其名称进行序列化,其中包含的数据会嵌套在内部。

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
enum Shape {
    Circle { radius: f64 },
    Square { side: f64 },
}

嵌套结构

serde 会自动递归处理。包含其他派生结构体或 Vec 的结构体可以直接使用。

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct Address { city: String }

#[derive(Serialize, Deserialize)]
struct Person {
    name: String,
    addresses: Vec<Address>,
}

仅序列化或仅反序列化

您可以只派生其中一个 trait。API 响应类型可能只需要 Serialize;传入的请求类型可能只需要 Deserialize。

use serde::Serialize;

#[derive(Serialize)]
struct ApiResponse {
    status: u16,
    message: String,
}

派生要求

每个字段的类型都必须实现您派生的 trait。标准类型和集合已经实现了这些 trait;自定义类型则需要自行派生。

use serde::Serialize;

#[derive(Serialize)]
struct Inner { x: i32 }

#[derive(Serialize)]
struct Outer { inner: Inner }

快速检查

测试您对序列化和反序列化的理解。

回顾

您已经学习了 serde 的基础知识:

  • serde 是与格式无关的序列化和反序列化框架
  • #[derive(Serialize, Deserialize)] 会生成转换代码
  • 适用于结构体、枚举和嵌套类型
  • 在适当情况下,您可以只派生一个方向的转换

下一步:通过 serde_json 使用 JSON。

常见问题解答

「序列化与反序列化」课时是免费的吗?

是的 — 「序列化与反序列化」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 4 节课。

「序列化与反序列化」这节课中我会学到什么?

派生宏 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn Rust Coding 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「序列化与反序列化」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn Rust Coding 课中编写并运行代码吗?

能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 序列化与反序列化
  2. 处理 JSON
  3. 自定义序列化
  4. 其他格式
← 返回 Learn Rust Coding