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 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(许可证/MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则您提交的任何有意包含在作品中的贡献,根据Apache-2.0许可证定义,应如上双许可,而不附加任何额外条款或条件。
依赖关系
~110-355KB