#cbor #binary #serde #minicbor

no-std minicbor-ser

A simple implementation of serde for minicbor

3 unstable releases

0.2.0 Nov 28, 2022
0.1.4 Nov 17, 2022
0.1.3 Mar 16, 2022
0.1.2 Nov 13, 2021

#977 in Encoding

Download history 182/week @ 2024-01-05 184/week @ 2024-01-12 182/week @ 2024-01-19 623/week @ 2024-01-26 118/week @ 2024-02-02 232/week @ 2024-02-09 204/week @ 2024-02-16 158/week @ 2024-02-23 157/week @ 2024-03-01 250/week @ 2024-03-08 246/week @ 2024-03-15 289/week @ 2024-03-22 224/week @ 2024-03-29 158/week @ 2024-04-05 156/week @ 2024-04-12 158/week @ 2024-04-19

735 downloads per month
Used in 31 crates (via wasmbus-rpc)

MIT license



crev reviews

This repository provides a simple implementation of serde for minicbor, making it easier to use.

Quick start

Just like using other serde derived libraries:

minicbor-ser = "0.1.*"
  • Serialization
use minicbor_ser as cbor;
use serde::Serialize;
fn main(){
    #[derive(Debug, Serialize)]
    struct TestStruct {
        hello: String,

    let test_struct = TestStruct {
            hello: "world".to_string(),

    let value = cbor::to_vec(&test_struct).unwrap();
        [0xA1u8, 0x65, 0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x65, 0x77, 0x6F, 0x72, 0x6C, 0x64],
  • Deserialization
use minicbor_ser as cbor;
use serde::Deserialize;
fn main(){
    #[derive(Debug, Deserialize, PartialEq)]
    struct TestStruct {
        hello: String,

    let data = [0xA1u8, 0x65, 0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x65, 0x77, 0x6F, 0x72, 0x6C, 0x64];
    let value: TestStruct = cbor::from_slice(&data[..]).unwrap();
        TestStruct {
            hello: "world".to_string(),

By default, structs will be serialized as map and tuples will be serialized as array. If you don't want to wrap top-level struct and tuple with map and array, you can use to_vec_flat. To deserialize you should use from_slice_flat.

let expect = [0x01u8, 0x18, 0xff, 0x65, 0x68, 0x65, 0x6c, 0x6c, 0x6f];
let tuple_flatten = (0x01u8, 0xffu8, "hello");
let value = to_vec_flat(&tuple_flatten).unwrap();

let data = crate::to_vec_flat(&exp).unwrap();
let value = from_slice_flat(&data).unwrap();
assert_eq!(exp, value);

Type mapping table

The following represents how the minicbor-ser will map the types of Rust and CBOR

  • ❌ : Not support
  • ⚠ : Not perfect yet
unsigned integer unsigned integer
negative Integer negative Integer
&str String
String String
struct map (if flatten_top is false)
Map map
slice array (if flatten_top is false)
&[u8] bytes
tuple array (if flatten_top is false)
Vec array (if flatten_top is false)
Vec Bytes
newtype variant map
unit variant String
tuple variant array
struct variant map


The current no-std feature of minicbor-ser requires alloc. If your machine cannot use alloc, it is recommended that you use the derive feature that comes with minicbor.
To enable no-std, use :

minicbor-ser = { version = "0.1.*", default-features = false }


Some types of serialization and deserialization may be different from minicbor, depending on how minicbor is implemented. If you need the default implementation of minicbor, please use minicbor_ser::cbor to access its API.


~44K SLoC