Rust Serde 与序列化
Serde 作为序列化框架:derive、格式无关的数据模型、JSON 常见边界。
#type / concept
#status / growing
#tech / dev
#resource / rust
[!info] 关联笔记
Rust Serde 与序列化
这个概念为什么出现
服务要在 JSON/消息/配置间搬结构体。
Serde 用 Serialize/Deserialize 把数据模型与格式解耦。
[!abstract] 一句话理解 为类型 derive Serde trait,再选用
serde_json等格式 crate 做编码解码;属性控制字段命名与默认值。
最小可运行示例
场景:API 响应结构体
// 需依赖 serde / serde_json
/*
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize, Debug)]
struct OrderDto {
id: u64,
#[serde(rename = "total_cents")]
total_cents: u32,
}
fn main() {
let o = OrderDto { id: 1, total_cents: 990 };
let s = serde_json::to_string(&o).unwrap();
println!("{s}");
let back: OrderDto = serde_json::from_str(&s).unwrap();
println!("{back:?}");
}
*/
fn main() {
println!(r#"{{"id":1,"total_cents":990}}"#);
}
结合场景再看三个关注点
- DTO 与领域模型可分离
- 未知字段策略(deny_unknown_fields)
- 错误是 Result
核心概念
- 格式无关中间表示
- 属性:
rename、default、skip、flatten - 枚举外部/内部标记
- 手工 impl 用于怪异格式
工程实践
- 公共 API 版本化字段
- 测试黄金 JSON
- 大数/金额用整数
- 流式 API 处理大文档
本节总结
- Serde 是生态中枢
- derive 覆盖大多数
- 与 HTTP/配置强相关
自测题
- 为什么金额别用 f64 进 JSON DTO?
- Serialize 与具体 JSON 库关系?
参考答案
- 浮点精度。
- Serde 定义如何序列化;serde_json 提供 JSON 格式实现。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| serde.rs | 官方生态 | 框架 |
| serde_json | 生态 | JSON |