核心 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 原样重新导出。
前两章分别是两条主线的接口:序列化一侧类型推数据,反序列化一侧格式回调类型。后五章是围绕它们的细节。
- Serialize 与 Serializer:
Serializer的 30 个serialize_*方法对应数据模型,七种复合类型各有一个「开始 → 逐个元素 →end」的状态对象;len: Option<usize>只是格式可以信任的声明,bincode 要靠它写长度前缀,serde_json 只看是不是Some(0);is_human_readable、Impossible,以及给fmt::Formatter实现的Serializer。 - Deserialize、Deserializer 与 Visitor:控制权反转,格式调
Visitor;deserialize_*只是提示,自描述格式可以都转给deserialize_any,非自描述格式必须照提示读;Visitor的默认实现报invalid_type。 - SeqAccess、MapAccess 与 EnumAccess:复合类型怎么交给
Visitor:逐个取元素、键值分两步取、先取变体再取内容;DeserializeSeed让反序列化带上状态。 - 生命周期 'de 与借用:
'de是输入的生命周期,visit_borrowed_str和visit_str的区别决定能不能借用;DeserializeOwned和Cow的#[serde(borrow)]。 - 错误:错误类型由格式定义,serde 只规定构造方式;
Unexpected和Expected怎么拼出invalid type: ..., expected ...。 - 标准库类型的实现:
impls.rs里的整数范围检查、Option、Vec的谨慎预分配、Box/Rc、Duration/SystemTime、IgnoredAny。 - 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 派生宏。
💬 关联讨论
发起讨论加载中...