Rust 对象序列化:Serde 及其他工具

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

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

开始课程

Rust 对象序列化:库与工具概述



序列化是软件开发中的基本过程之一。它允许将复杂的数据结构(对象、结构体、枚举)转换为连续的格式,便于存储在磁盘上或通过网络传输。逆过程——反序列化——则从该格式恢复原始对象。在 Rust 语言中,解决此问题的是一个生态系统,其核心是 Serde(序列化/反序列化)库。



在本文中,我们将详细分析 Rust 中的序列化是如何工作的,有哪些库可用,以及如何在实际中使用它们。



为什么选择 Serde?



Serde 不仅仅是一个库,更是一个用于序列化和反序列化的框架。其主要特点是将功能分为两部分:



  • Serde 数据模型——核心部分,定义了 Rust 数据类型如何转换为中间表示。
  • 格式适配器——独立的 crate,用于处理特定格式(JSON、YAML、TOML、Bincode、MessagePack 等)。


这种方法允许使用相同的代码处理不同的格式,只需在 Cargo.toml 中更改一行即可。



引入与基本配置



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



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


关键特性是使用 #[derive(Serialize, Deserialize)] 属性。它会自动生成用于转换您的结构体的代码:



use serde::{Serialize, Deserialize};

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

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

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

// 反序列化回来 let deserialized: User = serde_json::from_str(&json).unwrap(); println!("已恢复: {:?}", deserialized);}


使用不同格式



Serde 支持数十种格式。我们来看一下最流行的几种:



JSON (serde_json)

Web API 中最常见的格式。人类可读,但占用空间较大。



// 序列化为字符串let json_str = serde_json::to_string(&data)?;

// 序列化为流(文件)let file = std::fs::File::create("data.json")?;let writer = std::io::BufWriter::new(file);serde_json::to_writer(writer, &data)?;

// 从文件读取let file = std::fs::File::open("data.json")?;let reader = std::io::BufReader::new(file);let data: MyStruct = serde_json::from_reader(reader)?;


Bincode (bincode)

二进制格式——紧凑且快速。非常适合内部存储或 Rust 服务之间的传输。



// Cargo.toml: bincode = "1.3"

let encoded: Vec<u8> = bincode::serialize(&data)?;let decoded: MyStruct = bincode::deserialize(&encoded)?;


YAML 和 TOML (serde_yaml, toml)

用于配置文件。人类可读,支持注释(YAML)。



// YAMLlet yaml = serde_yaml::to_string(&data)?;let data: MyStruct = serde_yaml::from_str(&yaml)?;

// TOML(在 Rust 生态系统中很流行)let toml = toml::to_string(&data)?;let data: MyStruct = toml::from_str(&toml)?;


高级功能:Serde 属性



Serde 提供了强大的属性,用于精细调整序列化:



#[derive(Serialize, Deser                    

推荐