当你需要在 Rust 代码中序列化和反序列化数据时,serde 库是一个强大而灵活的工具;它支持多种数据格式,并且可以轻松地将 Rust 数据结构转换为这些格式的文本或二进制表示。
以下是一些常用数据格式处理方法:
示例:
Serde 简介
Serde 是一个用于高效且通用地进行 Rust 数据结构序列化与反序列化的框架。
Serde 生态由两部分组成:一是能够自我序列化与反序列化的数据结构,二是能处理其他数据序列化的格式模块。Serde 作为两者交互的桥梁,使得任何受支持的数据结构都能通过任意受支持的格式进行序列化操作。
Serde 基于 Rust 强大的 trait 系统构建;数据结构通过实现 Serde 的 Serialize 和 Deserialize trait(或使用 Serde 的派生属性在编译时自动生成实现),即可获得序列化能力。
Traits
Trait | 作用 |
---|---|
Deserialize | 数据结构可以被序列化 |
Deserializer | 数据格式如何序列化数据 |
Serialize | 数据结构可以被反序列化 |
Serializer | 数据格式如何反序列化数据 |
理解 Deserialize、Deserializer、Serialize、Serializer
我们用一个简单的 Rust 结构体 Person 和 JSON 数据格式来演示 Serde 的核心概念。
定义数据结构(实现 Serialize 和 Deserialize):
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize, Debug)]
struct Person {
name: String,
age: u32,
}
Serialize
:表示Person
可以被序列化(如转换成 JSON)。Deserialize
:表示Person
可以被反序列化(如从 JSON 解析回来)。
将Person
转换成 JSON 字符串:
fn main() {
let person = Person {
name: "Alice".to_string(),
age: 30,
};
// 使用 `serde_json::Serializer`(JSON 格式的序列化器)
let json_str = serde_json::to_string(&person).unwrap();
println!("Serialized: {}", json_str); // 输出:{"name":"Alice","age":30}
}
- 变量
person
实现了Serialize
,所以它可以被序列化。 serde_json::to_string
函数内部使用了serde_json::Serializer
,负责把 Rust 结构转换成 JSON 字符串。
将 JSON 字符串解析回Person
:
fn main() {
let json_str = r#"{"name":"Bob","age":25}"#;
// 使用 `serde_json::Deserializer`(JSON 格式的反序列化器)
let person: Person = serde_json::from_str(json_str).unwrap();
println!("Deserialized: {:?}", person); // 输出:Person { name: "Bob", age: 25 }
}
Person
实现了Deserialize
,所以它可以被反序列化。serde_json::from_str
函数内部使用了serde_json::Deserializer
,负责把 JSON 字符串解析成 Rust 结构。