Rust兵器谱|千机伞:serde

Rust兵器谱|千机伞:serde

编码文章call10242025-04-03 19:33:5322A+A-

1. 江湖溯源(背景介绍)

在Rust江湖中,serde如同「千机伞」一般,能以万般变化应对不同场景。它专精于数据的序列化反序列化,能将内存中的数据结构无缝转换为JSON、YAML、TOML等格式,反之亦然。Serde凭借其高效、零拷贝设计,以及强大的可扩展性,成为Rust生态中处理结构化数据的核心工具。无论是网络通信、配置文件解析,还是数据持久化,Serde都能以“千机百变”之姿轻松应对。


2. 武学妙用(应用场景)

  • JSON数据处理:快速解析和生成JSON数据。
  • 配置文件读写:支持YAML、TOML等格式的配置加载与保存。
  • 网络协议编解码:与Protobuf、MessagePack等格式无缝集成。
  • 数据库交互:ORM框架(如Diesel)依赖Serde实现数据映射。
  • 跨语言数据交换:通过序列化实现与Python、JavaScript等语言的数据互通。

3. 兵器锻造(依赖引入)

在Cargo.toml中添加以下依赖:

[dependencies]
serde = { version = "1.0", features = ["derive"] }# 启用派生宏支持
serde_json = "1.0"# 可选:JSON格式支持
  • 默认特性:仅包含核心功能,需手动实现序列化逻辑。
  • derive特性:通过#[derive(Serialize, Deserialize)]自动生成代码。
  • 格式扩展:如serde_json、serde_yaml等需单独引入。

4. 初窥门径(5分钟上手)

4.a 基本招式(Hello World)

目标:定义一个结构体并序列化为JSON。

use serde::{Serialize, Deserialize};
use serde_json::json;

// 为结构体自动生成序列化/反序列化代码
#[derive(Serialize, Deserialize, Debug)]
struct User {
    name: String,
    age: u32,
}

fn main() {
    let user = User { name: "令狐冲".to_string(), age: 25 };

// 序列化为JSON字符串
    let json_str = serde_json::to_string(&user).unwrap();
    println!("{}", json_str);// 输出:{"name":"令狐冲","age":25}

// 反序列化回结构体
    let user_back: User = serde_json::from_str(&json_str).unwrap();
    println!("{:?}", user_back);// 输出:User { name: "令狐冲", age: 25 }
}

代码逻辑

  1. 通过#[derive]为结构体自动实现序列化接口。
  2. serde_json::to_string将结构体转为JSON字符串。
  3. serde_json::from_str将字符串解析回结构体。

4.b 十八般武艺(功能示例)

招式一:嵌套结构序列化

#[derive(Serialize, Deserialize)]
struct Post {
    title: String,
    author: User,// 嵌套User结构体
}

let post = Post {
    title: "独孤九剑".to_string(),
    author: User { name: "风清扬".to_string(), age: 70 }
};
println!("{}", serde_json::to_string_pretty(&post).unwrap());
// 输出格式化后的JSON,包含缩进和换行

招式二:枚举类型支持

#[derive(Serialize, Deserialize)]
enum Weapon {
    Sword(String),
    Bow { range: u32 },
}

let weapon = Weapon::Sword("倚天剑".to_string());
println!("{}", serde_json::to_string(&weapon).unwrap());
// 输出:{"Sword":"倚天剑"}

招式三:自定义字段名称

#[derive(Serialize)]
struct Task {
    #[serde(rename = "task_name")]// 自定义JSON字段名
    name: String,
    #[serde(skip_serializing_if = "Option::is_none")]// 忽略空字段
    description: Option,
}

let task = Task { name: "练剑".to_string(), description: None };
println!("{}", serde_json::to_string(&task).unwrap());
// 输出:{"task_name":"练剑"}

4.c 心法进阶(高级用法)

目标:为自定义类型手动实现序列化逻辑。

use serde::{Serialize, Serializer};

struct Coordinate(f32, f32);

impl Serialize for Coordinate {
    fn serialize(&self, serializer: S) -> Result
    where
        S: Serializer,
    {
// 将元组序列化为字符串格式:"x,y"
        serializer.serialize_str(&format!("{},{}", self.0, self.1))
    }
}

fn main() {
    let coord = Coordinate(12.34, 56.78);
    println!("{}", serde_json::to_string(&coord).unwrap());
// 输出:"12.34,56.78"
}

代码逻辑

  1. 手动实现Serialize trait,定义自定义序列化逻辑。
  2. 将Coordinate元组转换为字符串格式。

5. 秘籍出处(官方资源)

官网:https://serde.rs

Github:https://github.com/serde-rs/serde

Crates.io:https://crates.io/crates/serde


千机伞在手,万般数据皆可化形。serde助你在Rust江湖中纵横捭阖,无往不利!

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4