#derive-deserialize #serde-derive #serde #serialization #derive #serialization-deserialization

serde-lite-derive

为 serde-lite 实现 #[derive(Deserialize, Serialize, Update)]

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日

#22#serialization-deserialization

Download history 115/week @ 2024-03-15 136/week @ 2024-03-22 259/week @ 2024-03-29 185/week @ 2024-04-05 376/week @ 2024-04-12 241/week @ 2024-04-19 158/week @ 2024-04-26 161/week @ 2024-05-03 122/week @ 2024-05-10 94/week @ 2024-05-17 163/week @ 2024-05-24 137/week @ 2024-05-31 141/week @ 2024-06-07 158/week @ 2024-06-14 61/week @ 2024-06-21 92/week @ 2024-06-28

463 每月下载量
3 个crate中使用 (通过 serde-lite)

MIT 许可

57KB
1.5K SLoC

Serde Lite

Crates.io MIT licensed Build Status

这个库提供了比 Serde 更轻量级的通用序列化和反序列化实现。 这里的目的不是完全取代 Serde。Serde 已经做得非常出色,与 Serde 在序列化/反序列化速度和运行时内存使用量方面竞争没有太多意义。

我们主要关注 Serde 在某些方面可能不太方便的地方 - 也就是最终生成的二进制文件大小。根据你尝试序列化/反序列化的类型复杂度,Serde 可能会产生相当多的代码。另外,还有一些单态化,可能会让你的二进制文件中添加更多代码。

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

使用方法

你可以将这个库用作 Serde 的直接替代品。存在 SerializeDeserialize 特性,可以自动推导,还有一些属性(与 Serde 兼容),所以你真正需要做的只是将 serde-lite 替换为 serde 放入你的 Cargo.toml 中。

序列化

以下是一个将数据序列化为 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
    • 压平
    • 重命名
    • 跳过
    • 跳过序列化
    • 跳过序列化(如果)
    • 跳过反序列化
    • 序列化时使用
    • 反序列化时使用
    • 更新时使用
  • 枚举变体属性
    • 重命名

何时使用此库

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

何时避免使用此库

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

依赖项

~300–750KB
~18K SLoC