rust-Serialize序列和反序列Deserialize
🍎Serialize序列和反序列Deserialize认识
Deserialize 是 serde 库中的两个非常重要的 trait,分别用于序列化 和反序列化数据结构
序列化是将一个数据结构(例如结构体、枚举)转化为可以存储或传输的格式,通常是 JSON、Bincode、YAML 或其他格式的字节流
一句话记忆:
- Serialize = 序列化 = "写出去"
- Deserialize = 反序列化 = "读进来"
javascript
// 登录请求体
#[derive(serde::Deserialize)]
pub struct LoginRequest {
pub username: String,
pub password: String,
}
// 注册请求体
#[derive(Serialize)]
pub struct RegisterRequest {
pub username: String,
pub password: String,
}
🍎区别如下
有时候我们写请求体的方式略微不同
Deserialize 和 Serialize 都是 Rust 里 serde 库的两个重要 trait(特征)
Serialize
作用:把 Rust 结构体/枚举/数据类型 转换成外部格式(如 JSON、XML、二进制等)。
方向:Rust → 外部格式
常见场景:后端返回数据给前端时,需要把 Rust 结构体转成 JSON 字符串。
javascript
use serde::Serialize;
#[derive(Serialize)]
struct User {
name: String,
age: u8,
}
// 结构体转成 JSON 字符串
let user = User { name: "张三".to_string(), age: 18 };
let json = serde_json::to_string(&user).unwrap();
// json: {"name":"张三","age":18}
Deserialize
- 作用:把外部格式(如 JSON、XML、二进制等)转换成 Rust 结构体/枚举/数据类型。
- 方向:外部格式 → Rust
- 常见场景:前端提交 JSON 数据,后端需要把 JSON 转成 Rust 结构体来处理。
例子
javascript
use serde::Deserialize;
#[derive(Deserialize)]
struct User {
name: String,
age: u8,
}
// JSON 字符串转成结构体
let json = r#"{"name":"张三","age":18}"#;
let user: User = serde_json::from_str(json).unwrap();
// user.name == "张三"
e 之间有什么区别
总结对比
| trait | 方向 | 作用 | 常用场景 |
|---|---|---|---|
| Serialize | Rust → 外部格式 | 结构体转 JSON/其它格式 | 返回数据给前端 |
| Deserialize | 外部格式 → Rust | JSON/其它格式转结构体 | 接收前端请求数据 |
🍎使用
在 Cargo.toml 中引入 serde 和 serde_derive(如果你想通过 #[derive] 自动生成序列化和反序列化代码),以及支持的具体格式(如 serde_json)
javascript
[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
序列化使用
使用 #[derive(Serialize)] 来自动派生序列化实现
javascript
use serde::Serialize;
use serde_json;
#[derive(Serialize)]
struct Person {
name: String,
age: u32,
}
fn main() {
let person = Person {
name: String::from("Alice"),
age: 30,
};
// 将数据结构序列化为 JSON 字符串
let json = serde_json::to_string(&person).unwrap();
println!("Serialized JSON: {}", json);
}
反序列化
javascript
use serde::Deserialize;
use serde_json;
#[derive(Deserialize)]
struct Person {
name: String,
age: u32,
}
fn main() {
let json = r#"{ "name": "Alice", "age": 30 }"#;
// 将 JSON 字符串反序列化为 Person 结构体
let person: Person = serde_json::from_str(json).unwrap();
println!("Deserialized Person: {} is {} years old.", person.name, person.age);
}
Serialize序列和反序列Deserialize结合
结合可以将结构体序列化为 JSON,并在需要时将其反序列化回来。
javascript
use serde::{Serialize, Deserialize};
use serde_json;
#[derive(Serialize, Deserialize)]
struct Person {
name: String,
age: u32,
}
fn main() {
// 创建一个结构体实例
let person = Person {
name: String::from("Alice"),
age: 30,
};
// 序列化为 JSON 字符串
let json = serde_json::to_string(&person).unwrap();
println!("Serialized JSON: {}", json);
// 反序列化回结构体
let deserialized_person: Person = serde_json::from_str(&json).unwrap();
println!("Deserialized Person: {} is {} years old.", deserialized_person.name, deserialized_person.age);
}