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 编码

Download history 2618/week @ 2024-05-03 2509/week @ 2024-05-10 2610/week @ 2024-05-17 2203/week @ 2024-05-24 2579/week @ 2024-05-31 2268/week @ 2024-06-07 2596/week @ 2024-06-14 2437/week @ 2024-06-21 2282/week @ 2024-06-28 2938/week @ 2024-07-05 3931/week @ 2024-07-12 3660/week @ 2024-07-19 4373/week @ 2024-07-26 3748/week @ 2024-08-02 5344/week @ 2024-08-09 4384/week @ 2024-08-16

18,547 每月下载量
用于 26 个 crates (23 个直接使用)

MIT/Apache

265KB
6.5K SLoC

位码

Documentation crates.io Build

一个具有以下目标的二进制编码器/解码器

  • 🔥 极快
  • 🐁 微小序列化大小
  • 💎 高度可压缩的 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-2.0许可证定义的任何有意提交以包含在作品中的贡献,将按照上述方式双授权,不附加任何额外条款或条件。

依赖项

~0.1–1.1MB
~32K SLoC