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 编码
9,429 每月下载次数
在 42 个crate中(直接使用31个) 中使用
195KB
5K SLoC
快速的二进制序列化框架
此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,值: {u32或u128}} |
std::时间::Duration |
{secs: u64,subsec_nanos: u32} |
std::时间::SystemTime |
std::time::Duration 自 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 相同,但针对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)]
指定给定的枚举变体应使用的预设标签值。
许可
根据您的选择,许可为以下之一
- Apache License, Version 2.0, (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
at your option.
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义,您提交的任何有意包含在工作中的贡献,将按上述方式双许可,没有任何附加条款或条件。
依赖关系
~0.3–2.5MB
~56K SLoC