Expand description
Serialize structured data.
§Overview
A binary serialization library designed to efficiently and safely:
- Serialize structured data into a binary format
- Deserialize untrusted binary input into structured data
§Supported Types
Natively supports:
- Primitives:
u8
,u16
,u32
,u64
,i8
,i16
,i32
,i64
,f32
,f64
,bool
- Collections:
Vec<T>
,Option<T>
, tuples, and fixed-size arrays like[u8; N]
- Recursive serialization of nested structs and enums via trait implementations
User-defined types can be serialized and deserialized by implementing the Codec
trait.
For types with a constant encoded size, optionally implement the SizedCodec
trait.
§Example
use bytes::{Buf, BufMut};
use commonware_codec::{Codec, Error};
// Define a custom struct
#[derive(Debug, Clone, PartialEq)]
struct Point {
xy: (u64, u64),
z: Option<u32>,
metadata: [u8; 11],
}
// Implement the Codec trait
impl Codec for Point {
fn write(&self, buf: &mut impl BufMut) {
// Basic types can be written by inferring the type
self.xy.write(buf);
self.z.write(buf);
self.metadata.write(buf);
}
fn read(buf: &mut impl Buf) -> Result<Self, Error> {
// Basic types can be inferred by the return type
let xy = <(u64, u64)>::read(buf)?;
let z = <Option<u32>>::read(buf)?;
let metadata = <[u8; 11]>::read(buf)?;
Ok(Self { xy, z, metadata })
}
fn len_encoded(&self) -> usize {
self.xy.len_encoded() + self.z.len_encoded() + self.metadata.len_encoded()
}
}
Re-exports§
pub use codec::Codec;
pub use codec::SizedCodec;
pub use error::Error;
pub use types::net;
pub use types::primitives;