rust-Serialize序列和反序列Deserialize

rust-Serialize序列和反序列Deserialize

🍎Serialize序列和反序列Deserialize认识

Deserializeserde 库中的两个非常重要的 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 中引入 serdeserde_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);
}
相关推荐
星星在线29 分钟前
MusicFree:一个「All in One」的个人音乐服务器,让听歌回归简单
前端·后端
IT_陈寒1 小时前
Redis的SETNX并发问题让我加了三天班
前端·人工智能·后端
demo007x2 小时前
Docling 文档转换以及技术架构分析
前端·后端·程序员
袋鱼不重3 小时前
我的神奇同事,AI 用多了居然写了个 Open In Codex
前端·后端·ai编程
用户8356290780513 小时前
使用 Python 操作 Word 内容控件
后端·python
像我这样帅的人丶你还3 小时前
啥? 前端也要会干Java?🛵🛵🛵
后端
Hommy883 小时前
【剪映小助手】添加贴纸接口(Add Sticker)
后端·github·剪映小助手·视频剪辑自动化·剪映api
CaffeinePro4 小时前
FastAPI响应处理:返回值、状态码、响应头与异常标准化与案例解析
后端
HuanYu4 小时前
PageHelper分页的原理
后端
于先生吖4 小时前
SpringBoot对接大模型开发AI命理测算系统:八字排盘与AI解析接口源码全解
人工智能·spring boot·后端