20 releases (7 breaking)

new 0.7.4 Jul 22, 2021
0.7.0-pre.1 Jun 21, 2021
0.4.0 Feb 19, 2021
0.2.1 Dec 12, 2020
0.2.0 Nov 19, 2020

#389 in Procedural macros

Download history 184/week @ 2021-04-07 171/week @ 2021-04-14 445/week @ 2021-04-21 737/week @ 2021-04-28 590/week @ 2021-05-05 693/week @ 2021-05-12 688/week @ 2021-05-19 995/week @ 2021-05-26 841/week @ 2021-06-02 864/week @ 2021-06-09 1597/week @ 2021-06-16 1761/week @ 2021-06-23 1845/week @ 2021-06-30 2779/week @ 2021-07-07 4018/week @ 2021-07-14 3640/week @ 2021-07-21

6,357 downloads per month
Used in 26 crates (via rkyv)

MIT license

110KB
2K SLoC

rkyv (archive) is a zero-copy deserialization framework for Rust

Discord

Resources

Learning Materials

  • The rkyv book covers the motivation, architecture, and major features of rkyv
  • The rkyv discord is a great place to get help with specific issues and meet other people using rkyv

Documentation

Benchmarks

  • The rust serialization benchmark is a shootout style benchmark comparing many rust serialization solutions. It includes special benchmarks for zero-copy serialization solutions like rkyv.

Sister Crates

  • bytecheck, which rkyv uses for validation
  • ptr_meta, which rkyv uses for pointer manipulation
  • rend, which rkyv uses for endian-agnostic features

Example

use rkyv::{
    archived_root,
    ser::{serializers::AllocSerializer, Serializer},
    Archive, Deserialize, Infallible, Serialize,
};

#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
struct Test {
    int: u8,
    string: String,
    option: Option<Vec<i32>>,
}

let value = Test {
    int: 42,
    string: "hello world".to_string(),
    option: Some(vec![1, 2, 3, 4]),
};

let mut serializer = AllocSerializer::<256>::default();
serializer.serialize_value(&value).unwrap();
let bytes = serializer.into_serializer().into_inner();

let archived = unsafe { archived_root::<Test>(&bytes[..]) };
assert_eq!(archived.int, value.int);
assert_eq!(archived.string, value.string);
assert_eq!(archived.option, value.option);

let deserialized: Test = archived.deserialize(&mut Infallible).unwrap()
assert_eq!(deserialized, value);

Dependencies

~320–750KB
~19K SLoC