Skip to main content

Crate speedy

Crate speedy 

Source
Expand description

§A fast binary serialization framework

Documentation

The goal of this crate is to provide fast, simple and easy binary serialization.

§Benchmarks

See rust_serialization_benchmark for benchmarks.

§Example

use std::borrow::Cow;
use speedy::{Readable, Writable, Endianness};

#[derive(PartialEq, Debug, Readable, Writable)]
enum Enum {
    A,
    B,
    C,
}

#[derive(PartialEq, Debug, Readable, Writable)]
struct Struct< 'a > {
    number: u64,
    string: String,
    vector: Vec< u8 >,
    cow: Cow< 'a, [i64] >,
    float: f32,
    enumeration: Enum
}

fn main() {
    let original = Struct {
        number: 0x12345678ABCDEF00,
        string: "A totally pointless string".to_owned(),
        vector: vec![ 1, 2, 3 ],
        cow: Cow::Borrowed( &[ 4, 5, 6 ] ),
        float: 3.1415,
        enumeration: Enum::C
    };

    let bytes = original.write_to_vec().unwrap();
    let deserialized: Struct =
        Struct::read_from_buffer( &bytes ).unwrap();

    assert_eq!( original, deserialized );
}

§Supported types

Out-of-box the following types are supported:

TypeSerialized as
u8as-is
u16as-is
u32as-is
u64as-is
usizeu64
i8as-is
i16as-is
i32as-is
i64as-is
f32as-is
f64as-is
boolu8, either 0 or 1
charu32
String{length: u32, bytes: [u8]}
Cow<'a, str>{length: u32, bytes: [u8]}
Vec<T>{length: u32, values: [T]}
Cow<'a, [T]>{length: u32, values: [T]}
HashMap<K, V>{length: u32, values: [K, V]}
BTreeMap<K, V>{length: u32, values: [K, V]}
HashSet<T>{length: u32, values: [T]}
BTreeSet<T>{length: u32, values: [T]}
Range<T>(T, T)
RangeInclusive<T>(T, T)
Option<T>(1_u8, T) or 0_u8
Result<T, E>(1_u8, T) or (0_u8, E)
()nothing
(T)as-is
(T, T)as-is
(T, .., T)as-is
enums{tag: u32, variant: T}
AtomicU8u8
AtomicI8i8
AtomicU16u16
AtomicI16i16
AtomicU32u32
AtomicI32i32
AtomicU64u64
AtomicI64i64
NonZeroU32u32
std::net::Ipv4Addru32
std::net::Ipv6Addru128
std::net::IpAddr{is_ipv4: u8, value: {u32 or u128}}
std::time::Duration{secs: u64, subsec_nanos: u32}
std::time::SystemTimestd::time::Duration since UNIX_EPOCH
uuid::Uuid[u8; 16]

These are stable and will not change in the future.

§Field attributes

§#[speedy(length = $expr)]

Can be used on most standard containers to specify the field’s length. Can refer to any of the previous fields.

For example:

use speedy::{Readable, Writable};

#[derive(Readable, Writable)]
struct Struct {
    byte_count: u8,
    #[speedy(length = byte_count / 4)]
    data: Vec< u32 >
}

Before serializing you need to make sure that whatever is set as length is equal to the .len() of the field; if it’s not then you will get an error when trying to serialize it.

Setting this attribute changes the serialization format as follows:

TypeSerialized as
Vec<T>[T]
Cow<'a, [T]>[T]
String[u8]
Cow<'a, str>[u8]
HashMap<K, V>[K, V]
BTreeMap<K, V>[K, V]
HashSet<T>[T]
BTreeSet<T>[T]

§#[speedy(length_type = $ty)]

Can be used to specify the exact size of the implicit length field of a container as it is read or written.

Possible values:

  • u7 (same as u8, but restricted to 7 bits for u64_varint compatibility)
  • u8
  • u16
  • u32 (default)
  • u64_varint

§#[speedy(varint)]

Can be used only on u64 fields. Forces the field to be serialized as a varint.

§#[speedy(skip)]

Skips a given field when reading and writing.

§#[speedy(default_on_eof)]

If an EOF is encountered when reading this field its value will be set to the default value for its type and the EOF will be ignored.

§#[speedy(constant_prefix = $expr)]

Specifies a static string of bytes which will be written or has to be present when reading before a given field.

§Enum attributes

§#[speedy(tag_type = $ty)]

Can be used to specify the exact size of the enum’s tag as it is read or written.

Possible values:

  • u7 (same as u8, but restricted to 7 bits for u64_varint compatibility)
  • u8
  • u16
  • u32 (default)
  • u64_varint

§#[speedy(peek_tag)]

An enum marked with this attribute will not consume its tag value when reading from a stream, nor will it write its own tag when writing.

§Enum variant attributes

§#[speedy(tag = $expr)]

Specifies a preset tag value to be used for a given enum variant.

§License

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.

§Contribution

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.

Structs§

BigEndian
Error
LittleEndian

Enums§

Endianness

Traits§

Context
IsEof
Readable
Reader
Writable
Writer

Derive Macros§

Readable
Writable