1 个不稳定版本

0.8.7 2023年8月10日

#1856编码

Download history 51/week @ 2024-04-01 64/week @ 2024-04-08 55/week @ 2024-04-15 27/week @ 2024-04-22 19/week @ 2024-04-29 37/week @ 2024-05-06 39/week @ 2024-05-13 27/week @ 2024-05-20 4/week @ 2024-05-27 18/week @ 2024-06-03 26/week @ 2024-06-10 23/week @ 2024-06-17 33/week @ 2024-06-24 52/week @ 2024-07-01 37/week @ 2024-07-08 12/week @ 2024-07-15

135 次每月下载
3 个crate中使用 (2 个直接使用)

MIT/Apache

195KB
5K SLoC

快速二进制序列化框架

Documentation

本crate的目的是提供快速、简单且易于使用的二进制序列化。

性能测试

性能测试请参考 rust_serialization_benchmark

示例

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 );
}

支持类型

默认支持以下类型

类型 序列化格式
u8 原样
u16 原样
u32 原样
u64 原样
usize u64
i8 原样
i16 原样
i32 原样
i64 原样
f32 原样
f64 原样
bool u8,要么是 0,要么是 1
char u32
String {长度: u32,字节: [u8]}
Cow<'a, str> {长度: u32,字节: [u8]}
Vec<T> {长度: u32,: [T]}
Cow<'a, [T]> {长度: u32,: [T]}
HashMap<K, V> {长度: u32,: [K,V]}
BTreeMap<K, V> {长度: u32,: [K,V]}
HashSet<T> {长度: u32,: [T]}
BTreeSet<T> {长度: u32,: [T]}
Range<T> (T,T)
RangeInclusive<T> (T,T)
Option<T> (1_u8, T)0_u8
Result<T, E> (1_u8, T)(0_u8, E)
()
(T) 原样
(T,T) 原样
(T, ..,T) 原样
enum 枚举 {标签: u32,变体:T}
AtomicU8 u8
AtomicI8 i8
AtomicU16 u16
AtomicI16 i16
AtomicU32 u32
AtomicI32 i32
AtomicU64 u64
AtomicI64 i64
NonZeroU32 u32
std::net::Ipv4Addr u32
std::net::Ipv6Addr u128
std::net::IpAddr {is_ipv4: u8,: {u32u128}}
std::time::Duration {secs: u64,subsec_nanos: u32}
std::time::SystemTime std::time::Duration since UNIX_EPOCH
uuid::Uuid [u8; 16]

这些是稳定的,将来不会改变。

字段属性

#[speedy(长度= $expr)]

可以在大多数标准容器上使用,用于指定字段的长度。可以引用任何前面的字段。

例如

use speedy::{Readable, Writable};

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

在序列化之前,您需要确保设置为 length 的值等于字段的 .len();如果不等于,则在尝试序列化时会出错。

设置此属性将按以下方式更改序列化格式

类型 序列化格式
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)]

可用于指定容器隐式长度字段在读取或写入时的确切大小。

可能的值

  • u7(与 u8 相同,但限制为 7 位,以便与 u64_varint 兼容)
  • u8
  • u16
  • u32(默认值)
  • u64_varint

#[speedy(varint)]

仅可用于 u64 字段。强制字段以 varint 格式序列化。

#[speedy(skip)]

在读取和写入时跳过指定的字段。

#[speedy(default_on_eof)]

如果在读取此字段时遇到 EOF,则其值将设置为该类型默认值,并将 EOF 忽略。

#[speedy(constant_prefix= $expr)]

指定在给定字段之前写入或读取之前必须存在的静态字节数组。

枚举属性

#[speedy(tag_type= $ty)]

可用于指定枚举标签在读取或写入时的确切大小。

可能的值

  • u7(与 u8 相同,但限制为 7 位,以便与 u64_varint 兼容)
  • u8
  • u16
  • u32(默认值)
  • u64_varint

#[speedy(peek_tag)]

带有此属性的枚举在从流中读取时不会消耗其标签值,在写入时也不会写入自己的标签值。

枚举变体属性

#[speedy(标签= $expr)]

指定为给定枚举变体使用的预设标签值。

许可

根据您选择的任何一种许可

贡献

除非您明确声明,否则您提交给工作以包含在内的任何贡献,如 Apache-2.0 许可证中定义的,将根据上述方式双许可,没有其他条款或条件。

依赖

~0.3–2.5MB
~57K SLoC