动手
前面八部分读的是 serde 的源码。这一部分反过来,不依赖 serde 自己写一遍:只留五种数据类型,trait 的形状照抄,格式只写 JSON,derive 只做具名字段的 struct。写完之后拿同一个 struct 分别交给自己的写出器和 serde_json,比较输出的字节。
- 写一个迷你 serde:四个 crate 约 1000 行。
Serializer的复合类型照样拆成「开始、逐个元素、end」;Visitor默认全部拒绝;解析器按首字节分派,没有转义的字符串直接借用输入;derive 宏 64 行。输出和 serde_json 1.0.154 逐字节相同,110 多万个字符的转义也一致;差别在错误位置、数字键的读回和没写的那些类型上。
flowchart TB model["数据模型 五种类型"] --> sertrait["Serialize Serializer"] model --> detrait["Deserialize Visitor"] sertrait --> writer["JSON 写出器"] detrait --> parser["JSON 解析器"] derive["derive Serialize"] --> sertrait writer --> cmp["与 serde_json 对比"] parser --> cmp
💬 关联讨论
发起讨论加载中...