全景
这一部分不深入任何一个 trait,先回答两个问题:serde 为什么是现在这个样子,以及一次 to_string / from_str 在 trait 层面到底调了哪些方法。读完之后,02 核心 trait 和 03 派生宏里的每一章都能在这里的两份调用日志里找到对应的那几行。
- 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 的设计对比。 - 一次往返:
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
💬 关联讨论
发起讨论加载中...