#cbor #serde #binary #minicbor


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

#225 in Encoding

Download history 466/week @ 2023-02-07 566/week @ 2023-02-14 725/week @ 2023-02-21 1724/week @ 2023-02-28 640/week @ 2023-03-07 640/week @ 2023-03-14 835/week @ 2023-03-21 665/week @ 2023-03-28 596/week @ 2023-04-04 1402/week @ 2023-04-11 787/week @ 2023-04-18 485/week @ 2023-04-25 633/week @ 2023-05-02 349/week @ 2023-05-09 512/week @ 2023-05-16 361/week @ 2023-05-23

1,931 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.


~39K SLoC