1个不稳定版本
0.2.2 | 2020年12月25日 |
---|
#1265 在 编码
86KB
2K SLoC
ordcode
一组原始和Serde序列化器,用于快速、无前缀编码,并保留值的字典序排列。
它旨在用于编码键值数据库中的键和值。
OMG!又一个序列化格式?
在大多数现有设计中,通过转义"序列结束"字节来执行字节序列的无前缀编码。这需要额外的空间,并且在没有处理整个输入缓冲区的情况下很难知道序列长度;这也使得反序列化数据的内存分配变得复杂。相反,我们利用键值数据库中记录大小始终已知的事实。此实现依赖于"双向"缓冲区设计:序列长度是varint编码并推送到缓冲区末尾,因此只需反序列化几个字节就可以获得序列化字节序列的原长度。对于序列化,此实现提供了序列化本身之前(非常快)计算序列化数据确切大小的功能。这些特性使得对于重复扫描和无需堆(#[no-std]
)目标的环境,能够进行有效的和可预测的缓冲区管理。
特性
- 支持升序和降序的字典序排列编码
- 编码将可变长度序列的长度放置在序列化数据末尾,因此结果编码是无前缀的,并有利于字典序排列
- 零分配,支持
#[no_std]
环境 - 在不实际进行序列化的情况下以较低成本获取序列化数据确切大小的方法,以进行有效的缓冲区管理
- 序列长度和判别符的空间效率varint编码
- 易于自定义(字节序、原始类型编码等),并提供有用的预置
- 双端缓冲区的读取器/写入器特性,因此您可以实现自己的或使用crate提供的实现
- 无不安全代码
Cargo.toml功能和相关依赖
serde
(默认开启):包含serde
序列化器和反序列化器。如果您只需要原始数据,您可以关闭此选项。std
(默认开启):若要禁用,请使用#[no-std]
,这将导致您失去一些使用Vec<u8>
的便利方法。
稳定性保证
底层编码格式简单,不太可能改变。作为保障,Serializer
和Deserializer
为所有序列化参数预置实现了FormatVersion
特质(params::AscendingOrder
、params::PortableBinary
、params::NativeBinary
)。
注意:使用降序字典序进行序列化对于像rocksdb这样的键值数据库特别有用,因为反向遍历比正向遍历慢。
许可证
许可证适用于以下之一:
- Apache License,版本2.0(《LICENSE-APACHE.txt》或http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(《LICENSE-MIT.txt》或http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交给作品并包含在内的任何贡献,应如上双许可,不附加任何额外条款或条件。
依赖项
~110–350KB