2 个版本
| 0.1.1 | 2022年2月25日 |
|---|---|
| 0.1.0 | 2022年2月25日 |
#1670 in 编码
每月 21 次下载
35KB
1K SLoC
serde-nothing
这个 crate 以 serde 数据模型定义了“无”,并允许使用仅 Serialize 和 Deserialize 特性来检查值和创建这样的值。
动机
这个 crate 被设计用来泛化序列化模式,在序列化时跳过具有 None/空/默认值的结构字段,在反序列化时当缺少时构建这些字段。
通常这个模式使用 #[serde(default, skip_serializing_if = "Option::is_none/Vec::is_empty/is_default")] 来编码。其中 is_default 是一个定义为
fn is_default<T: Default + PartialEq>(value: &T) -> bool {
*value == T::default()
}
这种模式对于具有具体类型和泛型包装器(如 Option、Vec 和类似)的字段工作得非常好。
但是在泛型类型 T 的字段上使用 #[serde(default)] 将需要在 Deserialize 实现 Default 约束。并且使用 #[serde(skip_serializing_if = "is_default")] 将需要在 Serialize 实现上添加 T: Default + PartialEq 约束。
这个包允许在不添加额外约束的情况下实现这种模式。更进一步,它允许针对可以跳过的类型进行特殊化。也就是说,如果字段类型是T,并且没有合适的值可以跳过,代码将继续正确工作,并且简单地总是序列化该字段,并需要反序列化所需的数据。
魔法?不,是科学!
这个包提供了一个无状态的Nothing类型,它是一种特殊的serde::Serializer或serde::Deserializer。 Nothing可以用于序列化和反序列化“无”值。“无”值包括None、空集合、单位、结构体和元组,其中所有字段都是“无”
使用Nothing序列化“非无”值总是失败的。
作为反序列化器,Nothing将访问与匹配“无”类型的最合适的Visitor方法,例如None、空切片/序列/映射、没有在区分符和负载中有“无”的单例枚举、0数值等。
用户很可能希望使用快捷方式,并使用is_nothing函数进行序列化,以及使用from_nothing函数进行反序列化。
许可证
根据您选择的以下许可证之一授权:
- Apache License,版本2.0,(许可证/APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(许可证/MIT 或 https://open-source.org.cn/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则您提交的任何有意包含在作品中的贡献,根据Apache-2.0许可证定义,应如上双许可,而不附加任何额外条款或条件。
依赖关系
~110-355KB