重新思考 Rust 序列化:Deser 的另一种架构
来源: lucumr.pocoo.org
概述
Armin Ronacher 在长期受 Serde 边界情况困扰后,重启了自己 2022 年的实验项目 Deser。它保留 Serde 的用户体验,却把架构反过来:由格式驱动类型、把状态放到堆上,从而摆脱递归与数据模型丢信息的限制。
核心要点
- 典型反例之一:任意精度数字被 Serde 用“带魔法键的 map”做带内信号,导致内部标签枚举在缓冲时解析失败。
- #[serde(flatten)] 会先把值缓冲,键 “42” 于是沦为字符串,整数键的 HashMap 因此报错,且错误位置还指向文档末尾。
- 适配器无法组合:函数不能当类型参数,所以 from_hex 没法作用在 Option 或 Vec 内部,只能为每种包装手写新函数。
- Deser 把流程反过来:格式告诉类型下一个值的种类并向 sink 推事件,遇到嵌套就交出新的 sink,所有状态放在 arena 里。
- 因此 Deser 不能支持 protobuf 这类非自描述格式——这是为摆脱 Serde 限制而刻意接受的取舍。
- 根因被归结为三点:所有格式共用一套 trait、固定数据模型在缓冲时丢信息、以及依赖调用栈递归。
- 作者并不认为 Deser 会取代 Serde,他更希望它能启发别人去探索这个设计空间。
金句
这些都不是容易修的 bug,它们是设计的结果,而这个设计受到 Serde 稳定性保证的保护。
👍 0
👎 0
← 返回 Lobsters 首页