rust-Serialize序列和反序列Deserialize

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);
}
相关推荐
Zelman5 分钟前
第06章-超节点
人工智能·后端
Raas1007 分钟前
AI网关能做语义缓存吗?MAI Gateway(魔芋企业级AI网关)实战能力深度解读
java·后端·spring
静水深码9 分钟前
AI 能翻好谐音梗吗
人工智能·后端
柏修12 分钟前
Java工程师转型Agent Engineer - 24周详细学习计划
后端
牛气冲天的星球13 分钟前
服务器资源监控之grafana+Prometheus配置
后端
Zelman14 分钟前
第07章-数据中心网络
后端·网络协议
属于自己的天空15 分钟前
Claude Code 进阶自动化:用 Memory + Hook 把重复操作变成全自动
后端
AI视觉监控工程师16 分钟前
视频分析平台高并发告警架构实战:从"识别到告警"的工程化落地
后端
小蒜学长18 分钟前
基于SpringBoot+Vue的租房管理系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·租房管理
洋就在江州23 分钟前
gitlab-cicd 离线集成——springboot-cicd (非docker形式,shell形式)
java·spring boot·后端·ci/cd·gitlab·gitlab-runner