其他格式
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 反馈 — 无需本地设置。