#serialization #deserialize #values #serde #v8 #codec #deno

serde_v8

Rust 到 V8 序列化和反序列化

212 次重大发布

新功能 0.215.0 2024年8月21日
0.213.0 2024年8月19日
0.209.0 2024年7月29日
0.181.0 2024年3月21日
0.1.0 2021年3月26日

#99 in 编码

Download history 10971/week @ 2024-05-04 14166/week @ 2024-05-11 23193/week @ 2024-05-18 13603/week @ 2024-05-25 13340/week @ 2024-06-01 19249/week @ 2024-06-08 14921/week @ 2024-06-15 14004/week @ 2024-06-22 13097/week @ 2024-06-29 13918/week @ 2024-07-06 9321/week @ 2024-07-13 12837/week @ 2024-07-20 10808/week @ 2024-07-27 9424/week @ 2024-08-03 13847/week @ 2024-08-10 14782/week @ 2024-08-17

50,730 每月下载次数
139 个包(12 个直接) 中使用

MIT 许可证

88KB
2.5K SLoC

serde_v8

作者:Aaron O'Mullan [email protected]

支持对 (rusty_)v8 值进行编码/解码的 Serde。

广义上,serde_v8 旨在提供一个表达性强但效率尽可能高的编码层,以双向映射 Rust & v8/js 值。它是 deno 的 op 层的核心组件,用于编码/解码所有非缓冲值。

原始问题: denoland/deno#9540

快速入门

serde_v8 自然地融入了 serde 生态系统,因此如果您已经使用过 serdeserde_jsonserde_v8 的 API 应该非常熟悉。

serde_v8 提供了两个关键函数

  • to_v8: 将 rust->v8 映射,类似于 serde_json::to_string,...
  • from_v8: 将 v8->rust 映射,类似于 serde_json::from_str,...

最佳实践

虽然 serde_v8serde_json::Value 兼容,但请注意,serde_json::Value 本质上是一个类型宽松的值(类似于嵌套的 HashMap),因此在编写操作时,我们建议直接使用 Rust 结构体/tuples 或原始类型,因为映射到 serde_json::Value 会导致额外的开销,并导致操作变慢。

我还建议避免不必要的 "包装器",如果你的操作只接受一个键的 struct,考虑将其展开为普通值,除非你计划在不久的将来添加字段。

与其通过 Ok(json!({})) 返回 "nothing",请将返回类型改为 Rust 的单位类型 () 并返回 Ok(())serde_v8 会高效地将它编码为 JS 的 null

TODO

  • 尝试使用 KeyCache 优化结构体键
  • 尝试使用外部 v8 字符串
  • 探索使用 json-stringifier.cc 的快速路径处理数组
  • 改进测试以测试与 serde_json 的兼容性(应该是可以互换的)
  • 考虑一个可由自身反序列化的 Payload 类型(包含作用域 & 值)
  • 确保我们在 .unwrap() 上返回错误而不是崩溃

依赖项

~68MB
~1.5M SLoC