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);
}
相关推荐
HONG````10 小时前
HarmonyOS ArkUI 弹窗全解:Toast、AlertDialog 与 CustomDialog 封装
后端
JaneConan10 小时前
鸿蒙 ArkUI 深水区:@Watch 和 @Observed,状态变了「自动跑」+ 嵌套对象「深层重绘」
开发语言·后端·ui·harmonyos
用户409666013175110 小时前
学生成绩查询系统:从 5000 人到 50 万人,你会怎么设计它?
后端
你为她披上外套时我正站在窗外11 小时前
5 分钟玩转 siwi-download:CLI + Rust 库上手指南
后端
橘子海全栈攻城狮11 小时前
【最新源码】基于SpringBoot + Vue的超市管理系统的设计与实现D002
java·开发语言·vue.js·spring boot·后端·spring
2501_9185823711 小时前
HarmonyOS应用开发实战:小事记 - Stage 模型下 EntryAbility 的启动流程与 Want 解析机制
后端
名字还没想好☜12 小时前
Go 用 errgroup 管理并发子任务:错误收敛、取消传播与限流
开发语言·后端·golang·go·并发
星栈独行13 小时前
Node 框架怎么选?Express、Koa、Egg、NestJS 场景化选型指南
后端·程序人生·node.js
你为她披上外套时我正站在窗外13 小时前
拆解 siwi-download:Rust 异步下载器是怎么炼成的
后端
苍何13 小时前
WAIC深度体验:能跨端使用的 Agent 才是好 Agent!
后端