14 个版本 (6 个稳定)
新 3.0.1 | 2024年8月18日 |
---|---|
3.0.0 | 2023年8月24日 |
2.0.0 | 2023年2月28日 |
1.0.2 | 2022年4月9日 |
0.0.0-reserve.0 | 2021年7月16日 |
#63 in 编码
每月下载量 8,179
用于 25 个crate (14 个直接)
260KB
6.5K SLoC
Pot
为 BonsaiDb
编写的简洁存储格式。
Pot 是在 BonsaiDb
中使用的编码格式。其目的是为 serde
提供一个编码格式,
-
是自我描述的。
-
在生产环境中运行是安全的。
-
是紧凑的。虽然仍然是自我描述的,但 Pot 的主要节省空间功能是在序列化过程中不重复符号/标识符。在序列化结构体数组时,这可以带来重大差异。请参阅 logs.rs 示例。
$ cargo test --example logs -- average_sizes --nocapture Generating 1000 LogArchives with 100 entries. +-----------------+-----------+-----------------+ | Format | Bytes | Self-Describing | +-----------------+-----------+-----------------+ | pot | 2,627,586 | yes | +-----------------+-----------+-----------------+ | cbor | 3,072,369 | yes | +-----------------+-----------+-----------------+ | msgpack(named) | 3,059,915 | yes | +-----------------+-----------+-----------------+ | msgpack | 2,559,907 | no | +-----------------+-----------+-----------------+ | bincode(varint) | 2,506,844 | no | +-----------------+-----------+-----------------+ | bincode | 2,755,137 | no | +-----------------+-----------+-----------------+
示例
use serde_derive::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Eq, PartialEq)]
pub struct User {
id: u64,
name: String,
}
fn main() -> Result<(), pot::Error> {
let user = User {
id: 42,
name: String::from("ecton"),
};
let serialized = pot::to_vec(&user)?;
println!("User serialized: {serialized:02x?}");
let deserialized: User = pot::from_slice(&serialized)?;
assert_eq!(deserialized, user);
// Pot also provides a "Value" type for serializing Pot-encoded payloads
// without needing the original structure.
let user: pot::Value<'_> = pot::from_slice(&serialized)?;
println!("User decoded as value: {user}");
Ok(())
}
输出
User serialized: [50, 6f, 74, 00, a2, c4, 69, 64, 40, 2a, c8, 6e, 61, 6d, 65, e5, 65, 63, 74, 6f, 6e]
User decoded as value: {id: 42, name: ecton}
基准测试
由于基准测试可能具有主观性,并且通常不反映真实世界的使用情况,因此该库的作者不做任何具体的性能声明。Pot 实现空间节省的方式需要一些计算开销。因此,预计理论上完美的 CBOR 实现可能会优于理论上完美的 Pot 实现。
GitHub Actions 上当前基准测试套件的结果可在 此处查看。当前套件仅旨在比较每个库的默认性能。
序列化到新的 Vec<u8>
序列化到重用的 Vec<u8>
反序列化
开源许可证
本项目,就像Khonsu Labs的其它所有项目一样,是开源的。本仓库遵循MIT许可证或Apache许可证2.0。
要了解更多关于贡献的信息,请参阅CONTRIBUTING.md。
依赖项
~425–790KB
~16K SLoC