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