3 个版本
0.1.3 | 2023 年 9 月 18 日 |
---|---|
0.1.2 | 2023 年 9 月 18 日 |
0.1.1 | 2023 年 9 月 18 日 |
#15 在 #discriminant
每月 214 次下载
在 3 个 crate 中使用 (通过 smb3)
16KB
323 行
serde_dis
该 crate 提供了两个宏,用于为枚举生成 serde
Serialize
和 Deserialize
实现。
这些是 SerializeWithDiscriminant
和 DeserializeWithDiscriminant
这些实现将枚举序列化和反序列化为一个结构体,其中区分符作为第一个字段,而变体字段作为后续字段。
Deserialize
实现期望反序列化器调用结构体的 visit_seq
,这主要是因为我所针对的反序列化器就是这样做的。visit_map
可以实现,但这里有一个缺点,即这种方法仅在反序列化的映射始终将区分符作为第一个条目时才有效。
以下是一些示例
该枚举将被序列化/反序列化为 u32
#[derive(DeserializeWithDiscriminant, SerializeWithDiscriminant, Debug, PartialEq)]
#[repr(u32)]
enum Foo {
A = 1,
B = 2,
C = 3,
}
它还支持带有字段的枚举
该枚举将首先序列化/反序列化其区分符值(一个 u16
),然后是任何字段
#[derive(DeserializeWithDiscriminant, SerializeWithDiscriminant, Debug, PartialEq)]
#[repr(u16)]
enum Bar {
A(String) = 1,
B {
a: i32,
b: u32,
} = 12,
C(i32, u64) = 7,
#[serde(other)]
D = 9,
}
支持的 serde
属性
other
这将使任何未知区分符反序列化为给定的变体rename
容器属性。这允许您重命名枚举。
依赖关系
~235–670KB
~16K SLoC