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 编码
50,730 每月下载次数
在 139 个包(12 个直接) 中使用
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 生态系统,因此如果您已经使用过 serde
或 serde_json
,serde_v8
的 API 应该非常熟悉。
serde_v8
提供了两个关键函数
to_v8
: 将rust->v8
映射,类似于serde_json::to_string
,...from_v8
: 将v8->rust
映射,类似于serde_json::from_str
,...
最佳实践
虽然 serde_v8
与 serde_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