8 个版本 (4 个重大更改)

0.5.0 2023年10月3日
0.4.0 2023年3月10日
0.3.2 2022年7月13日
0.3.1 2022年4月10日
0.1.0 2021年1月21日

#491 in 编码

Download history 222/week @ 2024-04-20 160/week @ 2024-04-27 203/week @ 2024-05-04 126/week @ 2024-05-11 122/week @ 2024-05-18 230/week @ 2024-05-25 151/week @ 2024-06-01 199/week @ 2024-06-08 181/week @ 2024-06-15 127/week @ 2024-06-22 209/week @ 2024-06-29 224/week @ 2024-07-06 157/week @ 2024-07-13 192/week @ 2024-07-20 270/week @ 2024-07-27 344/week @ 2024-08-03

每月下载量 1,039
4 个crate中使用 (3 个直接使用)

MIT 许可证

68KB
2K SLoC

Serde Lite

Crates.io MIT licensed Build Status

此库提供了比Serde更轻量级的通用序列化和反序列化实现。 但这里的意图并不是完全替代Serde。 Serde做得很出色,与其在序列化和反序列化速度以及运行时内存使用量上与Serde竞争,意义不大。

我们主要关注Serde在...代码中可能变得痛苦的一件事 - 那就是结果的二进制大小。根据您尝试序列化/反序列化的类型的复杂性,Serde可能会生成大量的代码。此外,还有一些单态化,这可能会使您的二进制文件中添加更多的代码。

为了实现其目标,此库对底层格式做出了一些假设。它使用类似于JSON的中间数据表示。然后可以使用Serde将中间格式序列化/反序列化。这意味着此库永远不会像Serde本身那样快。

用法

您可以将此库用作Serde的替换。存在可自动派生的 SerializeDeserialize 特性,还有一些与Serde兼容的属性,因此您实际上需要做的只是将 serde-lite 放入您的 Cargo.toml 中,而不是 serde

序列化

以下是将数据序列化为JSON的简要示例

use serde_lite::Serialize;
use serde_lite_derive::Serialize;

#[derive(Serialize)]
struct MyStruct {
    field1: u32,
    field2: String,
}

let instance = MyStruct {
    field1: 10,
    field2: String::from("Hello, World!"),
};

let intermediate = instance.serialize().unwrap();
let json = serde_json::to_string_pretty(&intermediate).unwrap();

反序列化

以下是从JSON反序列化的简要示例

use serde_lite::Deserialize;
use serde_lite_derive::Deserialize;

#[derive(Deserialize)]
struct MyStruct {
    field1: u32,
    field2: String,
}

let input = r#"{
    "field1": 10,
    "field2": "Hello, World!"
}"#;

let intermediate = serde_json::from_str(input).unwrap();
let instance = MyStruct::deserialize(&intermediate).unwrap();

更新

等等。什么?是的,此库还有一个非常酷的功能 - 部分更新。只需像派生 Deserialize 一样派生 Update。示例

use serde_lite::{Deserialize, Update};
use serde_lite_derive::{Deserialize, Update};

#[derive(Deserialize, Update)]
struct MyStruct {
    field1: u32,
    field2: String,
}

let mut instance = MyStruct {
    field1: 10,
    field2: String::new(),
};

let input = r#"{
    "field2": "Hello, World!"
}"#;

let intermediate = serde_json::from_str(input).unwrap();
let instance = instance.update(&intermediate).unwrap();

此功能在构建REST API并希望允许部分更新数据时特别有用。

支持的属性

库目前不支持所有Serde属性。欢迎提交补丁。以下属性是受支持的

  • 容器属性
    • tag
    • content
  • 字段属性
    • default
    • flatten
    • rename
    • skip
    • skip_serializing
    • skip_serializing_if
    • skip_deserializing
    • serialize_with
    • deserialize_with
    • update_with
  • 枚举变体属性
    • rename

何时使用此库

您可以在需要序列化/反序列化某些复杂类型且结果二进制大小对您很重要的情况下使用此库。它在对用户输入进行部分更新数据的项目中也非常有用(例如REST API)。

何时避免使用此库

如果对您来说唯一重要的是运行时性能,您可能不想使用此库。此外,它对序列化/反序列化大量数据也不是很有用,因为它需要首先转换为中间表示形式。最后,此库只能与自描述格式(如JSON)一起使用。

依赖项

~110–510KB
~10K SLoC