3个版本 (稳定版)
1.0.1 | 2024年2月28日 |
---|---|
1.0.0 | 2024年2月26日 |
0.1.0 | 2024年2月20日 |
#579 在 编码
55KB
1.5K SLoC
rust-fr
'rust-fr'(也称为rust for real
)是一个简单、非自描述的数据交换格式。
安装
您可以使用以下方法中的任何一种。
- 通过
cargo add rust-fr
添加 - 通过
Cargo.toml
添加
[dependencies]
rust-fr = "1"
使用。
use serde::{Serialize, Deserialize};
use rust_fr::{serializer, deserializer};
// define some data
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
struct Human {
name: String,
age: u8
};
let human = Human {
name: "Ayush".to_string(),
age: 19
};
// serialize the data to bytes (Vec<u8>)
let human_bytes = serializer::to_bytes(&human).unwrap();
// deserialize the data from serialized bytes.
let deserialized_human = deserializer::from_bytes::<Human>(&human_bytes).unwrap();
assert_eq!(human, deserialized_human);
基准测试。
- 运行
cargo test -- --nocapture --ignored
来运行基准测试。
running 3 tests
---- Small Data ----
rust_fr: 218 bytes
serde_json: 332 bytes
rmp_serde: 146 bytes
ciborium: 170 bytes
test tests::length_test_small_data ... ok
---- Medium Data ----
rust_fr: 14264 bytes
serde_json: 30125 bytes
rmp_serde: 10731 bytes
ciborium: 18347 bytes
test tests::length_test_medium_data ... ok
---- Large Data ----
rust_fr: 139214 bytes
serde_json: 367595 bytes
rmp_serde: 157219 bytes
ciborium: 198277 bytes
test tests::length_test_large_data ... ok
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 4 filtered out; finished in 0.01s
为什么?
目标是学习/理解。我写这个是为了了解serde的内部工作原理以及如何将数据编码成字节,这些字节最终可以在网络或其它地方传输。
格式规范。
- 该格式是非自描述的。
- 原始类型按原样序列化。
- bool:0 -> false,1 -> true(1位)
- i8, i16, i32, i64:按原样。
- u8, u16, u32, u64:按原样。
- f32, f64:按原样。
- char:作为u32(4字节)
- 分隔符用于分隔不同类型的数据。
- 字符串、字节和映射分隔符长度为1字节,而所有其他分隔符长度为3位。
- 分隔符
- 字符串 = 134; 0b10000110
- 字节 = 135; 0b10000111
- 单位 = 2; 0b010
- 序列 = 3; 0b011
- 序列值 = 4; 0b100
- 映射 = 139; 0b10001011
- 映射键 = 6; 0b110
- 映射值 = 7; 0b111
- 字符串、字节、单位和可选类型按以下方式序列化
- str:bytes + STRING_DELIMITER
- bytes:bytes + BYTE_DELIMITER
- unit:UNIT(null)
- option:None -> unit(), Some -> self
- 结构体按以下方式序列化
- unit_struct:unit()
- newtype_struct:self
- tuple_struct:seq()
- 枚举按以下方式序列化
- unit_variant:variant_index
- newtype_variant:variant_index + self
- tuple_variant:variant_index + tuple()
- struct_variant:variant_index + struct()
- seq(): 序列按以下方式序列化
- SEQ_DELIMITER + value_1 + SEQ_VALUE_DELIMITER + value_2 + SEQ_VALUE_DELIMITER + ... + SEQ_DELIMITER
- map(): 映射按以下方式序列化
- key_1 + MAP_KEY_DELIMITER + value_1 + MAP_VALUE_DELIMITER + key_2 + MAP_KEY_DELIMITER + value_2 + MAP_VALUE_DELIMITER + ... + MAP_DELIMITER
- 元组和结构体按以下方式序列化
- tuple:seq()
- struct:map()
许可。
这里是麻省理工学院(MIT),所以您可以随心所欲地做任何事情。您仍然可以在这里阅读它 这里。
依赖项
~1.3–1.9MB
~45K SLoC