3 个版本

0.1.3 2023 年 9 月 18 日
0.1.2 2023 年 9 月 18 日
0.1.1 2023 年 9 月 18 日

#15#discriminant

Download history • Rust 包仓库 3/week @ 2024-04-07 • Rust 包仓库 4/week @ 2024-05-12 • Rust 包仓库 1/week @ 2024-05-19 • Rust 包仓库 22/week @ 2024-05-26 • Rust 包仓库 64/week @ 2024-06-02 • Rust 包仓库 43/week @ 2024-06-09 • Rust 包仓库 52/week @ 2024-06-16 • Rust 包仓库 99/week @ 2024-06-23 • Rust 包仓库 24/week @ 2024-06-30 • Rust 包仓库 57/week @ 2024-07-07 • Rust 包仓库 51/week @ 2024-07-14 • Rust 包仓库 82/week @ 2024-07-21 • Rust 包仓库

每月 214 次下载
3 个 crate 中使用 (通过 smb3)

MIT 许可证

16KB
323

serde_dis

该 crate 提供了两个宏,用于为枚举生成 serde SerializeDeserialize 实现。

这些是 SerializeWithDiscriminantDeserializeWithDiscriminant

这些实现将枚举序列化和反序列化为一个结构体,其中区分符作为第一个字段,而变体字段作为后续字段。

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