代码之家  ›  专栏  ›  技术社区  ›  Karmic Coder

将枚举序列化为int

  •  6
  • Karmic Coder  · 技术社区  · 14 年前

    我希望通过一个Web服务返回以下类,该服务包含一个枚举类型作为其成员之一。

    [Serializable, XmlRoot("GeoCoordinate")]
    public class GeoCoordinate
    {
        public enum AccuracyLevel
        {
            Unknown = 0,
            Country = 1,
            Region = 2,
            SubRegion = 3,
            Town = 4,
            PostalCode = 5,
            Street = 6,
            Intersection = 7,
            Address = 8,
            Premise = 9
        }
    
        private AccuracyLevel _accuracy;
    
        // ... more members
    
    
        public AccuracyLevel Accuracy
        {
            get { return _accuracy; } 
            set { _accuracy = value;}
        }
    }
    

    这是正确的,但将返回以下形式的结果:

    <!-- ... -->
    <Accuracy>Unknown or Country or Region or SubRegion or Town or 
      PostalCode or Street or Intersection or Address or Premise</Accuracy>
    <!-- ... -->
    

    我希望它只返回一个整数,而不是表示枚举的字符串。在不改变 GeoCoordinate.Accuracy 是吗?

    3 回复  |  直到 14 年前
        1
  •  4
  •   Josh Stodola    14 年前

    虽然是黑客,但我认为 XmlEnumAttribute 在本例中,对每个枚举成员都是最容易处理的。如果这个枚举大得多,那么最好使用 XmlIgnore 在Accuracy属性上,向类中添加一个额外的int属性,如此问题的另一个答案中所述。

    美国海军 xmlenumattribute(xmlenumattribute) 这意味着只有枚举本身需要修改,并且无论在何处使用它,它都将像int一样进行XML序列化。

        public enum AccuracyLevel
        {
            [XmlEnum("0")] Unknown = 0,
            [XmlEnum("1")] Country = 1,
            [XmlEnum("2")] Region = 2,
            [XmlEnum("3")] SubRegion = 3,
            [XmlEnum("4")] Town = 4,
            [XmlEnum("5")] PostalCode = 5,
            [XmlEnum("6")] Street = 6,
            [XmlEnum("7")] Intersection = 7,
            [XmlEnum("8")] Address = 8,
            [XmlEnum("9")] Premise = 9
        }
    
        2
  •  3
  •   John Saunders    14 年前

    我相信你需要使用 [XmlIgnore] 并创建第二个返回整数值的属性:

    [XmlRoot("GeoCoordinate")]
    public class GeoCoordinate
    {
        public enum AccuracyLevel
        {
            Unknown = 0,
            Country = 1,
            Region = 2,
            SubRegion = 3,
            Town = 4,
            PostalCode = 5,
            Street = 6,
            Intersection = 7,
            Address = 8,
            Premise = 9
        }
    
        private AccuracyLevel _accuracy;
    
        // ... more members
    
    
        [XmlIgnore]
        public AccuracyLevel Accuracy
        {
            get { return _accuracy; } 
            set { _accuracy = value;}
        }
    
        [XmlElement("AccuracyLevel")]
        public int AccuracyLevelInt
        {
            get {return (int) AccuracyLevel;}
            set {AccuracyLevel = (AccuracyLevel) value;}
        }
    }
    

    注意 [Serializable] XML序列化程序未使用。

    另外,请注意 AccuracyLevelInt 属性的实现可能不正确。我现在正在调查。

        3
  •  1
  •   slugster Joey Cai    14 年前

    用修饰枚举 [Serializable] [DataContract] . 这两个属性之间存在一些差异,请确保您检查了它( this blog post 可能会有所帮助)。并用标记单个枚举项 [EnumMember] . 我从来没有检查过枚举在传输过程中的样子,但是这样做可以确保它到达另一端,并且还可以确保在生成客户端代理时它被接收。