Rust 中的对象序列化:serde、bincode、JSON 和 YAML

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Rust 中的对象序列化:serde 库与数据格式完全指南



序列化是将数据结构或对象转换为可保存到文件、通过网络传输或缓存格式的过程。在 Rust 语言中,这个问题可以通过 serde(序列化/反序列化)库优雅且高效地解决。本文将详细讲解 Rust 中的序列化是如何工作的,支持哪些数据格式,以及如何为你的项目选择合适的工具。



什么是 serde,为什么它是事实上的标准?



serde 是 Rust 中用于数据结构的序列化和反序列化的框架。它不绑定于特定格式——你可以使用 JSON、Bincode、YAML、TOML、MessagePack、CBOR 等多种格式。核心思想是:你只需描述一次你的结构体,serde 就会通过 Serialize 和 Deserialize trait 系统自动生成用于处理任何格式的代码。



serde 的优势:

  • 极致性能——代码在编译阶段生成(零成本抽象)
  • 类型安全——格式不匹配的错误在编译阶段即可捕获
  • 支持复杂结构:枚举、向量、哈希映射、嵌套对象
  • 可通过属性进行自定义


安装与基本配置



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



[dependencies]serde = { version = "1.0", features = ["derive"] }serde_json = "1.0"bincode = "1.3"


关键点在于 serde 的 "derive" 特性。没有它,你将需要手动实现 Serialize 和 Deserialize trait。



简单示例:序列化为 JSON



JSON 是 Web 应用和 API 中最流行的格式。来看一个基本示例:



use serde::{Serialize, Deserialize};

#[derive(Debug, Serialize, Deserialize)]struct User { id: u32, name: String, email: String, is_active: bool,}

fn main() { let user = User { id: 42, name: "Alexei".to_string(), email: "alex@example.com".to_string(), is_active: true, };

// 序列化为 JSON let json = serde_json::to_string(&user).unwrap(); println!("JSON: {}", json);

// 从 JSON 反序列化 let deserialized: User = serde_json::from_str(&json).unwrap(); println!("反序列化结果: {:?}", deserialized);}


输出:

JSON: {"id":42,"name":"Alexei","email":"alex@example.com","is_active":true}反序列化结果: User { id: 42, name: "Alexei", email: "alex@example.com", is_active: true }


使用 bincode 进行二进制序列化



对于高性能应用(游戏、实时系统、数据库),通常需要紧凑的二进制格式。bincode 是最佳选择之一:



use serde::{Serialize, Deserialize};

#[derive(Debug, Serialize, Deserialize)]struct GameState { level: u16, health: f32, inventory: Vec<String>, checkpoint: (f64, f64),}

fn main() { let state = GameState { level: 5, health: 87.5, inventory: vec!["sword".into(), "potion".into()], checkpoint: (120.5, -34.8), };

// 序列化为二进制格式 let binary = bincode::serialize(&state).unwrap(); println!("二进制大小: {} 字节", binary.len());

// 反序列化 let restored: GameState = bincode::deserialize(&binary).unwrap(); println!("恢复结果: {:?}", restored);}


与 JSON 相比,Bincode 在数据大小和处理速度上都有优势。例如,一个包含 4 个字段的结构体大约只占 40 字节,而 JSON 则需要 100 字节以上。



使用 YAML 和 TOML



对于配置文件

推荐