14 个不稳定版本 (5 个破坏性更新)
0.6.3 | 2024年7月14日 |
---|---|
0.6.0 | 2024年3月24日 |
0.5.0 | 2023年10月17日 |
0.4.0 | 2023年5月14日 |
#90 in 编码
18,547 每月下载量
用于 26 个 crates (23 个直接使用)
265KB
6.5K SLoC
位码
一个具有以下目标的二进制编码器/解码器
- 🔥 极快
- 🐁 微小序列化大小
- 💎 高度可压缩的 Deflate/LZ4/Zstd
相比之下,以下不是目标
- 跨主要版本稳定的格式
- 自描述格式
- 除 Rust 之外语言的兼容性
参见 rust_serialization_benchmark 以获取基准测试。
示例
use bitcode::{Encode, Decode};
#[derive(Encode, Decode, PartialEq, Debug)]
struct Foo<'a> {
x: u32,
y: &'a str,
}
let original = Foo {
x: 10,
y: "abc",
};
let encoded: Vec<u8> = bitcode::encode(&original); // No error
let decoded: Foo<'_> = bitcode::decode(&encoded).unwrap();
assert_eq!(original, decoded);
库示例
将 bitcode 添加到库中,无需指定主版本,以便二进制 crates 可以选择版本。这是一个 bitcode API 的最小稳定子集,因此避免使用任何其他功能。
bitcode = { version = "0", features = ["derive"], default-features = false, optional = true }
#[cfg_attr(feature = "bitcode", derive(bitcode::Encode, bitcode::Decode))]
pub struct Vec2 {
x: f32,
y: f32,
}
元组与数组
如果您有多个相同类型的值
- 当值在语义上不同时,使用元组或结构体:
x: u32, y: u32
- 当所有值在语义上相似时,使用数组:
pixels: [u8; 16]
实现细节
- 深受 https://github.com/That3Percent/tree-buf 的启发
- 将每个字段的每个实例分组在一起,使压缩更容易
- 尽可能使用更小的整数,一直到底部 1 位
- 在反序列化之前对类型向量进行前端验证
- 代码设计为可由 LLVM 自动向量化
#![no_std]
所有 std
-only 功能都位于(默认)"std"
功能之后。
需要 alloc
。
许可
许可方式为以下之一
- Apache License,版本 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的任何有意提交以包含在作品中的贡献,将按照上述方式双授权,不附加任何额外条款或条件。
依赖项
~0.1–1.1MB
~32K SLoC