#反序列化 #序列化 #serde #工具 #默认值 #字段值

不依赖 std serde-nothing

序列化到无,反序列化自无

2 个版本

0.1.1 2022年2月25日
0.1.0 2022年2月25日

#1670 in 编码

每月 21 次下载

MIT/Apache

35KB
1K SLoC

serde-nothing

crates docs actions MIT/Apache loc

这个 crate 以 serde 数据模型定义了“无”,并允许使用仅 SerializeDeserialize 特性来检查值和创建这样的值。

动机

这个 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()
}

这种模式对于具有具体类型和泛型包装器(如 OptionVec 和类似)的字段工作得非常好。

但是在泛型类型 T 的字段上使用 #[serde(default)] 将需要在 Deserialize 实现 Default 约束。并且使用 #[serde(skip_serializing_if = "is_default")] 将需要在 Serialize 实现上添加 T: Default + PartialEq 约束。

这个包允许在不添加额外约束的情况下实现这种模式。更进一步,它允许针对可以跳过的类型进行特殊化。也就是说,如果字段类型是T,并且没有合适的值可以跳过,代码将继续正确工作,并且简单地总是序列化该字段,并需要反序列化所需的数据。

魔法?不,是科学!

这个包提供了一个无状态的Nothing类型,它是一种特殊的serde::Serializerserde::DeserializerNothing可以用于序列化和反序列化“无”值。“无”值包括None、空集合、单位、结构体和元组,其中所有字段都是“无”

使用Nothing序列化“非无”值总是失败的。

作为反序列化器,Nothing将访问与匹配“无”类型的最合适的Visitor方法,例如None、空切片/序列/映射、没有在区分符和负载中有“无”的单例枚举、0数值等。

用户很可能希望使用快捷方式,并使用is_nothing函数进行序列化,以及使用from_nothing函数进行反序列化。

许可证

根据您选择的以下许可证之一授权:

由您选择。

贡献

除非您明确声明,否则您提交的任何有意包含在作品中的贡献,根据Apache-2.0许可证定义,应如上双许可,而不附加任何额外条款或条件。

依赖关系

~110-355KB