序列化与反序列化
派生宏
序列化与反序列化 是 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 反馈 — 无需本地设置。