Rust in Everything
基于 serde 1.0.229

全景

这一部分不深入任何一个 trait,先回答两个问题:serde 为什么是现在这个样子,以及一次 to_string / from_str 在 trait 层面到底调了哪些方法。读完之后,02 核心 trait 和 03 派生宏里的每一章都能在这里的两份调用日志里找到对应的那几行。

  1. serde 解决什么问题:M 个类型乘 N 种格式,靠中间的数据模型变成 M 加 N;数据模型的 29 种类型逐项对照 serialize_*、deserialize_*、visit_*(三者分别是 30、31、27 个方法,不一一对应);不用 Value 做中间层的原因(实测绕道 Value 后 bincode 的字节从 53 涨到 125 且读不回原类型);自描述格式与非自描述格式,bincode 和 postcard 读 serde_json::Value 都失败在 deserialize_any 上;和 borsh、rkyv 的设计对比。
  2. 一次往返:struct Post 加一个 enum,cargo expand 出两个 impl;用一个包住 serde_json 的打印式 Serializer 和一组打印式 Deserializer / Visitor 包装器,记下每一次调用和每一次写出的字节:序列化时 serialize_struct → 三次 serialize_field → end,当场写字节;反序列化时只调一次 deserialize_struct,之后 serde_json 回调 visit_map,u32 字段收到的是 visit_u64,未知字段只换来一次 visit_unit。
flowchart TB
  ty["类型:Post"] -->|"serialize 推数据"| model[数据模型]
  model --> fmt["格式:serde_json"]
  fmt -->|"visit 回调"| vis["Visitor:derive 生成"]
  vis --> ty

💬 关联讨论

发起讨论
加载中...