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
463 每月下载量
在 3 个crate中使用 (通过 serde-lite)
57KB
1.5K SLoC
Serde Lite
这个库提供了比 Serde 更轻量级的通用序列化和反序列化实现。 这里的目的不是完全取代 Serde。Serde 已经做得非常出色,与 Serde 在序列化/反序列化速度和运行时内存使用量方面竞争没有太多意义。
我们主要关注 Serde 在某些方面可能不太方便的地方 - 也就是最终生成的二进制文件大小。根据你尝试序列化/反序列化的类型复杂度,Serde 可能会产生相当多的代码。另外,还有一些单态化,可能会让你的二进制文件中添加更多代码。
为了达到这个目标,这个库对底层格式做了一些假设。它使用一个类似于 JSON 的中间数据表示。然后可以使用 Serde 将中间格式序列化/反序列化。这意味着这个库永远不会比 Serde 本身快。
使用方法
你可以将这个库用作 Serde 的直接替代品。存在 Serialize
和 Deserialize
特性,可以自动推导,还有一些属性(与 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