当你需要在 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 结构。