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.02021年7月16日

#63 in 编码

Download history 2387/week @ 2024-05-04 3413/week @ 2024-05-11 2499/week @ 2024-05-18 2227/week @ 2024-05-25 2657/week @ 2024-06-01 2099/week @ 2024-06-08 1714/week @ 2024-06-15 2537/week @ 2024-06-22 2658/week @ 2024-06-29 2608/week @ 2024-07-06 1848/week @ 2024-07-13 2310/week @ 2024-07-20 2089/week @ 2024-07-27 2190/week @ 2024-08-03 1744/week @ 2024-08-10 1833/week @ 2024-08-17

每月下载量 8,179
用于 25 个crate (14 个直接)

MIT/Apache

260KB
6.5K SLoC

Pot

BonsaiDb 编写的简洁存储格式。

Pot forbids unsafe code crate version Live Build Status HTML Coverage Report for main branch Documentation for main branch

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>

Serialize Benchmark Violin Chart

序列化到重用的 Vec<u8>

Serialize with Reused Buffer Benchmark Violin Chart

反序列化

Deserialize Benchmark Violin Chart

开源许可证

本项目,就像Khonsu Labs的其它所有项目一样,是开源的。本仓库遵循MIT许可证Apache许可证2.0

要了解更多关于贡献的信息,请参阅CONTRIBUTING.md

依赖项

~425–790KB
~16K SLoC