8 个版本 ()

1.0.0-rc.22022 年 12 月 3 日
0.14.0 2023 年 3 月 29 日
0.13.0 2023 年 2 月 18 日
0.12.0 2023 年 1 月 27 日
0.12.0-rc.22023 年 1 月 20 日

#1752解析器实现

每月 43 次下载

Apache-2.0

31KB
700

Zeroio 提供了与客户机高效通信的实用工具。

这类似于 serde 的 "序列化" 和 "反序列化",但设计目标不同

  • 客户机运行时性能至关重要。
  • 如果客户机必须读取一个未对齐在 32 位边界上的值,这将导致显著的性能下降。
  • 空间效率很好,但不如客户机运行时性能重要。
  • 我们希望能够方便地获取结构的加密散列。

作为回应,zeroio 与 serde 的实现方式不同

  • 只有一个网络格式;zeroio 不会试图像 serde 一样功能丰富。
  • 可用的数据类型更加有限
  • 我们不希望消耗任何周期进行反序列化或复制,因此我们将数据存储在一个易于访问的格式中,类似于 `rkyv' crate。
  • 与 rkyv 相比,我们使用切片而不是指针来引用可用的序列化数据。这使我们能够避免不安全代码。
  • 我们将所有数据缓冲区存储为 [u32](而不是更常见的 [u8])。
  • 有一个规范格式;任何同一数据的序列化都将构建相同的结构。为了获取加密散列,我们只需对 [u32] 切片进行散列。
  • 我们将所有数据缓冲区填充为空值,直到散列块的大小(剩下一个单词),以避免在计算散列时进行复制。

请注意,对于反序列化,虽然我们保证 sha(a) == sha(b) 意味着 deserialize_from(a) == deserialize_from(b),但我们不保证相反,即 deserialize_from(a) == deserialize_from(b) 意味着 a == b。

依赖关系

~0.7–1.4MB
~26K SLoC