#binary-encoding #serialization #enums #speedy #readable #length #field

persia-speedy

快速二进制序列化框架

15个版本

0.9.0 2021年1月24日
0.8.1 2020年12月25日
0.7.16 2020年11月26日

#1425 in 编码


用于 persia-rpc

MIT/Apache

145KB
4K SLoC

示例

use std::borrow::Cow;
use persia_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 endian = Endianness::LittleEndian;
    let bytes = original.write_to_vec_with_ctx( endian ).unwrap();
    let deserialized: Struct =
        Struct::read_from_buffer_with_ctx( endian, &bytes ).unwrap();

    assert_eq!( original, deserialized );
}

字段属性

#[persia_speedy(length= ...)]

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

例如

use persia_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= ...)]

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

可能值

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

#[speedy(skip)]

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

#[speedy(default_on_eof)]

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

#[speedy(constant_prefix= ...)]

指定一个静态字节数组,该数组将在给定字段之前写入或读取时存在。

枚举属性

#[speedy(tag_type= ...)]

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

可能值

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

#[speedy(peek_tag)]

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

枚举变体属性

#[speedy(tag= ...)]

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

许可证

许可协议为以下之一

由您选择。

贡献

除非您明确说明,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,均应双重许可,如上所述,不附加任何额外条款或条件。

依赖关系

~5.5MB
~106K SLoC