A binary encoder/decoder with the following goals: - 🔥 Blazingly fast - 🐁 Tiny serialized size - 💎 Highly compressible by Deflate/LZ4/Zstd
In contrast, these are non-goals: - Stable format across major versions - Self describing format - Compatibility with languages other than Rust
See rust_serialization_benchmark for benchmarks.
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);
Add bitcode to libraries without specifying the major version so binary crates can pick the version. This is a minimal stable subset of the bitcode API so avoid using any other functionality.
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,
}
If you have multiple values of the same type:
- Use a tuple or struct when the values are semantically different: x: u32, y: u32
- Use an array when all values are semantically similar: pixels: [u8; 16]
Licensed under either of * Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0) * MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
$ claude mcp add bitcode \
-- python -m otcore.mcp_server <graph>