0Pricing
Learn Rust Coding · 课时

其他格式

TOML、YAML、bincode

其他格式 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 4 节课。

超越 JSON

serde 的核心与格式无关,因此只需更换格式 crate,同一个派生结构体就能处理多种格式。

  • 使用 TOML 处理配置
  • 使用 YAML 处理适合人类阅读的数据
  • 使用 bincode 处理紧凑的二进制数据

一个结构体,多种格式

您只需定义一次结构体。每个格式 crate 都会针对同一组 Serialize / Deserialize 实现,提供各自的 to_string / from_str 等效函数。

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct Config {
    name: String,
    port: u16,
}

TOML

TOML 常用于配置(Cargo.toml 本身就使用它)。toml crate 可以对其进行序列化和解析。

use serde::Serialize;

#[derive(Serialize)]
struct Config { name: String, port: u16 }

fn to_toml(c: &Config) -> String {
    toml::to_string(c).unwrap()
}

解析 TOML

使用 toml::from_str 将 TOML 配置读取回结构体。

use serde::Deserialize;

#[derive(Deserialize)]
struct Config { name: String, port: u16 }

fn parse(s: &str) -> Config {
    toml::from_str(s).unwrap()
}

YAML

YAML 适合存储带有嵌套结构、由人编辑的数据。请使用 serde_yaml 等 crate,并采用相同形式的 API。

use serde::Serialize;

#[derive(Serialize)]
struct Config { name: String, port: u16 }

fn to_yaml(c: &Config) -> String {
    serde_yaml::to_string(c).unwrap()
}

bincode

bincode 是一种紧凑的二进制格式,非常适合缓存或通过网络传输,尤其适用于重视大小和速度且不需要人工阅读的场景。

use serde::Serialize;

#[derive(Serialize)]
struct Config { name: String, port: u16 }

fn to_bytes(c: &Config) -> Vec<u8> {
    bincode::serialize(c).unwrap()
}

选择格式

请根据使用者选择格式:

  • 需要嵌套的人类可读配置:TOML 或 YAML
  • Web API:JSON
  • 内部二进制存储或传输:bincode

模拟格式选择

这个决策只是将使用场景映射到格式。下面这个可运行示例展示了这种选择逻辑。

fn pick_format(use_case: &str) -> &str {
    match use_case {
        "config" => "TOML",
        "api" => "JSON",
        "cache" => "bincode",
        _ => "JSON",
    }
}

fn main() {
    println!("{}", pick_format("config"));
    println!("{}", pick_format("cache"));
    println!("{}", pick_format("api"));
}

字节往返转换

二进制格式支持往返转换:先序列化为字节,再反序列化回同一个结构体。下面这个可运行示例从概念上模拟了字节长度的往返过程。

fn encode(name: &str) -> Vec<u8> {
    name.as_bytes().to_vec()
}

fn decode(bytes: &[u8]) -> String {
    String::from_utf8(bytes.to_vec()).unwrap()
}

fn main() {
    let bytes = encode("Alice");
    println!("len={}", bytes.len());
    println!("back={}", decode(&bytes));
}

格式特有的差异

不同格式的能力各不相同。TOML 不允许 null,并且需要使用表表示嵌套;YAML 支持锚点;bincode 不包含自我描述信息,因此两端必须共享类型定义。

属性仍然适用

您学过的 #[serde(...)] 属性(rename、default、skip)适用于所有格式,因为它们作用于 serde 层,而不是格式层。

use serde::Serialize;

#[derive(Serialize)]
#[serde(rename_all = "kebab-case")]
struct Config { max_connections: u32 }

快速检查

测试您对其他格式的理解。

回顾

您已经了解了 serde 支持的其他格式:

  • 同一个派生结构体可以处理 TOML、YAML、JSON 和 bincode
  • 每个格式 crate 都提供熟悉的 to_string / from_str 风格 API
  • 根据使用场景选择格式:配置、API 或二进制存储
  • serde 属性适用于所有格式

至此,Serde 课程和 Rust 系列课程就完成了。

常见问题解答

「其他格式」课时是免费的吗?

是的 — 「其他格式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 4 节课。

「其他格式」这节课中我会学到什么?

TOML、YAML、bincode 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn Rust Coding 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「其他格式」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn Rust Coding 课中编写并运行代码吗?

能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 序列化与反序列化
  2. 处理 JSON
  3. 自定义序列化
  4. 其他格式
← 返回 Learn Rust Coding