16 个版本

0.8.7 2024年1月14日
0.8.6 2023年3月20日
0.8.5 2022年11月14日
0.8.2 2022年4月30日
0.4.0 2017年12月17日

#181 in 编码

Download history 2158/week @ 2024-04-23 2030/week @ 2024-04-30 2314/week @ 2024-05-07 1525/week @ 2024-05-14 1663/week @ 2024-05-21 1343/week @ 2024-05-28 1972/week @ 2024-06-04 1768/week @ 2024-06-11 1609/week @ 2024-06-18 1795/week @ 2024-06-25 1651/week @ 2024-07-02 2319/week @ 2024-07-09 3012/week @ 2024-07-16 2209/week @ 2024-07-23 1810/week @ 2024-07-30 2033/week @ 2024-08-06

9,429 每月下载次数
42 个crate中(直接使用31个) 中使用

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::时间::Duration {secs: u64,subsec_nanos: u32}
std::时间::SystemTime std::time::DurationUNIX_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 相同,但针对 u64_varint 兼容性限制为 7 位)
  • 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 相同,但针对 u64_varint 兼容性限制为 7 位)
  • u8
  • u16
  • u32(默认)
  • u64_varint

#[speedy(peek_tag)]

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

枚举变体属性

#[speedy(标签= $expr)]

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

许可

根据您的选择,许可为以下之一

at your option.

贡献

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

依赖关系

~0.3–2.5MB
~56K SLoC