#数据交换 #格式 #serde #自描述

rust-fr

一个简单、非自描述的数据交换格式

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