Rust in Everything
基于 serde 1.0.229

核心 trait

这一部分是本卷的重点:serde 的数据模型落在几组 trait 上,类型和格式各实现一半。代码都在 serde_core/src/ 里:ser/ 约 3.4k 行(mod.rs 2k,大半是文档),de/ 约 7.7k 行(mod.rs 2.4k、impls.rs 3.2k、value.rs 1.9k)。serde crate 把这些 trait 原样重新导出。

前两章分别是两条主线的接口:序列化一侧类型推数据,反序列化一侧格式回调类型。后五章是围绕它们的细节。

  1. Serialize 与 Serializer:Serializer 的 30 个 serialize_* 方法对应数据模型,七种复合类型各有一个「开始 → 逐个元素 → end」的状态对象;len: Option<usize> 只是格式可以信任的声明,bincode 要靠它写长度前缀,serde_json 只看是不是 Some(0);is_human_readable、Impossible,以及给 fmt::Formatter 实现的 Serializer。
  2. Deserialize、Deserializer 与 Visitor:控制权反转,格式调 Visitor;deserialize_* 只是提示,自描述格式可以都转给 deserialize_any,非自描述格式必须照提示读;Visitor 的默认实现报 invalid_type。
  3. SeqAccess、MapAccess 与 EnumAccess:复合类型怎么交给 Visitor:逐个取元素、键值分两步取、先取变体再取内容;DeserializeSeed 让反序列化带上状态。
  4. 生命周期 'de 与借用:'de 是输入的生命周期,visit_borrowed_str 和 visit_str 的区别决定能不能借用;DeserializeOwned 和 Cow 的 #[serde(borrow)]。
  5. 错误:错误类型由格式定义,serde 只规定构造方式;Unexpected 和 Expected 怎么拼出 invalid type: ..., expected ...。
  6. 标准库类型的实现:impls.rs 里的整数范围检查、Option、Vec 的谨慎预分配、Box / Rc、Duration / SystemTime、IgnoredAny。
  7. value 模块与 IntoDeserializer:de::value 里的小 Deserializer 把一个 Rust 值当成输入再反序列化一次,derive 生成的代码和缓冲都用到它们。
flowchart TB
  ty["Rust 类型"] -->|Serialize| ser[Serializer]
  ser --> compound["SerializeSeq 等状态对象"]
  fmtnode["数据格式"] -->|Deserializer| vis[Visitor]
  vis --> access["SeqAccess 等"]
  access --> ty
  compound --> fmtnode

格式一侧的完整实现以 serde_json 为例,在 05 一个格式:serde_json;derive 生成的代码怎么调用这些 trait,在 03 派生宏。

💬 关联讨论

发起讨论
加载中...