17 个版本 (9 个破坏性版本)

0.12.0 2024 年 8 月 9 日
0.11.0 2024 年 7 月 6 日
0.10.0 2024 年 6 月 3 日
0.6.0 2024 年 3 月 4 日
0.1.7 2022 年 11 月 11 日

#813 in Rust 模式

Download history 140/week @ 2024-05-05 2/week @ 2024-05-12 13/week @ 2024-05-19 1/week @ 2024-05-26 151/week @ 2024-06-02 15/week @ 2024-06-09 2/week @ 2024-06-16 112/week @ 2024-06-30 25/week @ 2024-07-07 2/week @ 2024-07-14 2/week @ 2024-07-21 94/week @ 2024-08-04

每月 98 次下载
2 个 crate 中使用 (通过 psibase)

MIT 许可证

60KB
1.5K SLoC

Rust 对 fracpack 格式的支持。

Psibase 使用一种新的二进制格式 fracpack,具有以下目标

  • 快速打包和解包数据,适用于服务间通信、节点间通信、区块链与外部通信以及数据库存储。
  • 前后兼容性;它支持在结构体和元组的末尾添加新的可选字段,即使它们嵌入在可变长度向量、固定长度数组、可选和其他结构体和元组中。
  • 可选的读取而不解包(几乎零复制);有助于高效处理大量数据。TODO:此库尚未实现此功能。
  • 不需要代码生成器来支持 C++ 或 Rust;宏和元编程处理它。
  • 与 Cap 'n' Proto 的压缩算法结合使用时,可进行有效的压缩。

示例使用

use fracpack::{Pack, Unpack, Result};

#[derive(Pack, Unpack, PartialEq, Debug)]
#[fracpack(fracpack_mod = "fracpack")]
struct Example {
    a_string: String,
    a_tuple: (u32, String),
}

let orig = Example {
    a_string: "content".into(),
    a_tuple: (1234, "5678".into()),
};

// Convert to fracpack format
let packed: Vec<u8> = orig.packed();

// Convert from fracpack format
let unpacked = Example::unpacked(&packed)?;

assert_eq!(orig, unpacked);

注意: #[fracpack(fracpack_mod = "fracpack")] 只在直接使用 fracpack 库而不是通过 psibase crate 时需要。

注意

很容易不小心将固定大小的数组引用(&[T;7])转换为切片(&[T])。这对fracpack很重要,因为它对这两种类型有不同的、不兼容的编码。

依赖项

~3MB
~65K SLoC