代码之家  ›  专栏  ›  技术社区  ›  spease

如何配置Serde以使用枚举变量的判别式而不是名称?

  •  3
  • spease  · 技术社区  · 7 年前

    我正在分析一个INI样式的文件,该文件使用整数作为枚举数。

    #[derive(Debug, Deserialize, Serialize)]
    pub enum MyThing {
        First = 0,
        Second = 1,
        Third = 2,
    }
    

    在文件中,该值将被序列化,如下所示:

    thing=0
    

    但是,默认情况下,Serde与变体名称匹配,而不是与判别式匹配。是自定义实现的 Deserialize 最干净的方法?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Shepmaster Tim Diekmann    5 年前

    Serde网站具有 entire example on how to serialize an enum as a number :

    [dependencies]
    serde = "1.0"
    serde_repr = "0.1"
    
    use serde_repr::*;
    
    #[derive(Serialize_repr, Deserialize_repr, PartialEq, Debug)]
    #[repr(u8)]
    enum SmallPrime {
        Two = 2,
        Three = 3,
        Five = 5,
        Seven = 7,
    }
    
    fn main() {
        use SmallPrime::*;
        let nums = vec![Two, Three, Five, Seven];
    
        // Prints [2,3,5,7]
        println!("{}", serde_json::to_string(&nums).unwrap());
    
        assert_eq!(Two, serde_json::from_str("2").unwrap());
    }
    

    我相信这是最好的方法,正如板条箱作者自己推荐的那样。