6 个版本

0.3.0 2023年7月7日
0.2.0 2023年3月29日
0.1.3 2022年5月6日
0.1.2 2022年4月23日

#1626 in 编码

每月 43 次下载
用于 levin

自定义许可证

44KB
1K SLoC

Epee {序列化/反序列化}库,纯Rust编写

此库旨在为现有类型添加简单且性能良好的epee序列化,几乎无需额外的样板代码。您可以序列化/反序列化实现了 SerializeDeserialize 特性的任何Rust类型,分别来自 serde 包。有关格式规范的更多信息,请参阅此处。以下是一些示例

序列化

use serde::{Serialize, Deserialize};
use serde_epee;

#[derive(Serialize, Deserialize, Debug)]
struct MyType {
    foo: u32,
    bar: i8,
    baz: String
}

fn main() {
    let foobar = MyType { foo: 23, bar: -1, baz: "Howdy, World!".to_string() };
    match serde_epee::to_bytes(&foobar) {
        Ok(foobytes) => println!("{:02x?}", foobytes),
        Err(err) => println!("Error: {}", err)
    }
}

这将输出以下字符串

[01, 11, 01, 01, 01, 01, 02, 01, 01,0c, 03, 66,6f,6f, 06, 17, 00, 00, 00, 03, 62, 61, 72, 04,ff, 03, 62, 61,7a,0a, 34, 48,6f, 77, 64, 79,2c, 20, 57,6f, 72,6c, 64, 21]

您还可以直接将数据序列化到 Write 接口

match File::create("epee_example.dat") {
    Ok(outf) => serde_epee::to_writer(outf, &foobar).unwrap(),
    Err(err) => println!("File error ;(")
}

反序列化

use serde::{Serialize, Deserialize};
use serde_epee;

#[derive(Serialize, Deserialize, Debug)]
struct MyType {
    foo: u32,
    bar: i8,
    baz: String
}

fn main() {
    let example_bytes = [1u8, 17, 1, 1, 1, 1, 2, 1, 1, 12, 3, 102, 111, 111, 6, 23, 0, 0, 0, 3, 98, 97, 114, 4, 255, 3, 98, 97, 122, 10, 52, 72, 111, 119, 100, 121, 44, 32, 87, 111, 114, 108, 100, 33];

    let foobar = serde_epee::from_bytes(&examples_bytes).unwrap();
    println!("{:?}", foobar);
}

依赖关系

~0.4–1MB
~24K SLoC