1 个稳定版本

1.0.0 2023年9月25日

#93#derive-debug

MIT 许可证

30KB
584

ESDE(序列化和反序列化库)

这个库的目的是将非递归数据结构轻松存储到文件中,并从中读取。这里的“简单”意味着格式是可由人类理解的,因此理论上也可以由其他语言/框架生成。

该包专注于以二进制形式存储数据,但也可以修改以存储其他格式。它还提供了 derive 宏(DeserializeSerialize),以推导出结构体和枚举的相应特征。

跨平台说明:没有特定的保证。最重要的是,切片/向量的长度以 usize 存储为 usize,其长度可能因平台而异。

Item

项目是数据序列化的单位。这可以是任何东西。我猜在大多数情况下,数据结构会序列化为二进制数据以存储在文件中,然后使用 [u8]。

反序列化

您有一个提供 Item 的对象,实现了 Sender 特征。这个特征为任何 std::io::Read 自动实现,"发送" [u8]。

可以从给定 Item 的流中反序列化的对象实现了 Deserialize<Item> 特征。提供了一些原始类型的实现,大多数其他类型应该可以通过相应的直观命名的 derive 宏推导出来。

如果反序列化对象,则必须知道其类型。换句话说:必须在解析类型之前知道类型。库不提供存储的类型信息。

序列化

您有一个接受 Item 的对象,实现了 Receiver 特性。这个特性对于任何 std::io::Write 都会自动实现,接收 [u8]s;

任何实现了 Serialize<Item> 特性的类型都可以使用任何 [Receiver<Type = Item>] 进行序列化。提供了一些原始类型的实现。

示例

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
struct Struct {
    another: AnotherStruct,
    an_enum: Enum,
    vector: Vec<u32>,
    option: Option<i64>,
    array: [String; 4],
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
struct AnotherStruct(u32, u32);

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
enum Enum {
    A,
    B(f64),
    C { x: AnotherStruct, y: u16 },
}

fn main() -> std::io::Result<()> {
    const FILE: &str = "test.bin";

    let example = Struct {
        another: AnotherStruct(69, 420),
        an_enum: Enum::B(69.420),
        vector: vec![69, 420, 1337],
        option: Some(-87),
        array: [
            String::from("one"),
            String::from("two"),
            String::from("three"),
            String::from("four"),
        ],
    };

    {
        let mut file = File::create(FILE)?;
        file.auto_ser(example.clone())?;
        // NOTE Receiver::auto could be used here if File didn't implement Read + Write
    }

    {
        let mut file = File::open(FILE)?;
        let person2: Struct = file.auto_de().map_err(Error::unwrap_sender)?;
        // NOTE Sender::auto could be used here if File didn't implement Read + Write
        println!("person1: {:#?}", example);
        println!("person2: {:#?}", person2);
        assert_eq!(example, person2);
        println!("indeed, they're equal")
    }

    Ok(())
}

计划中的未来功能

  • 在序列化(反序列化)时忽略字段的属性,它们必须实现 Default
  • 处理泛型类型

依赖项

~255–700KB
~17K SLoC