Rust Serde 与序列化

Serde 作为序列化框架:derive、格式无关的数据模型、JSON 常见边界。

#type / concept #status / growing #tech / dev #resource / rust

[!info] 关联笔记

Rust Serde 与序列化

这个概念为什么出现

服务要在 JSON/消息/配置间搬结构体。
SerdeSerialize/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}}"#);
}

结合场景再看三个关注点

  1. DTO 与领域模型可分离
  2. 未知字段策略(deny_unknown_fields)
  3. 错误是 Result

核心概念

  • 格式无关中间表示
  • 属性:renamedefaultskipflatten
  • 枚举外部/内部标记
  • 手工 impl 用于怪异格式

工程实践

  1. 公共 API 版本化字段
  2. 测试黄金 JSON
  3. 大数/金额用整数
  4. 流式 API 处理大文档

本节总结

  • Serde 是生态中枢
  • derive 覆盖大多数
  • 与 HTTP/配置强相关

自测题

  1. 为什么金额别用 f64 进 JSON DTO?
  2. Serialize 与具体 JSON 库关系?
参考答案
  1. 浮点精度。
  2. Serde 定义如何序列化;serde_json 提供 JSON 格式实现。

延伸阅读与资料来源

资料类型支撑内容
serde.rs官方生态框架
serde_json生态JSON
创建于 2026/7/15 更新于 2026/7/15