HeadlinesBriefing favicon HeadlinesBriefing.com

重新思考 Rust 序列化:Deser 库挑战 Serde 局限性

Hacker News •
×

Serde 是一个惊人的 Rust 序列化库,多年来它是我感到生产力的巨大原因。然而,当我在 Sentry 工作时,我对其一些局限性感到相当沮丧,但实际上替换 Serde 并不容易,因为它在生态系统中的影响力。另外,因为想要做得更好而不也做出一些潜在痛苦的妥协是相当困难的。这里有三个 Serde 边缘案例,显示 Serde 功能之间的不良交互或意外的局限性:一个是地图的数字。一个带有 serde_json arbitrary_precision 功能打开的内部标记枚举。展平会破坏整数键。适配器不会组合。这些都不是容易在 Serde 中修复的错误。它们是其设计所决定的,而该设计受 Serde 稳定性保证的保护。2022 年,我启动了一个名为 Deser 的实验。它是 Rust 的一个序列化库,将 Serde 的用户体验放在完全不同于 miniserde 启发的架构之上。我从未真正完成它,它在几年里一直躺着。我重新开始了它,现在它已经达到我认为值得关注的地平线。甚至只是为了激励他人看看他们是否想探索这个空间。名称与思想 Deser 的名字是 Serde 的两个半部交换后的结果。Deser 是 Serde 但以另一种方式。 在 Serde 中,类型驱动反序列化过程:Deserialize 实现会询问反序列化器期望的值类型,格式会回调到访问者。每个嵌套值都由递归处理,这使得 Serde 反序列化在每一级嵌套中都增长堆栈。Deser 则恰恰相反,格式告诉下一个值的类型并将事件推送到 sink。当 sink 遇到嵌套值的开始时,它不会调用它,而是将新的 sink 返回给 driver,该 driver 在Arena中保留所有状态(事实上,在Arena中)。在输出时,emitter 会返回它们的嵌套值而不是递归进入它们。