将枚举类型序列化为整数

6
我希望通过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 类型的情况下,能否实现这一点?


如何将枚举值序列化为整数? - Josh Stodola
3个回答

4
尽管这是一种hack方法,但我认为在这种情况下,在每个枚举成员上使用XmlEnumAttribute最容易接受。如果这个枚举更大,最好使用XmlIgnore来忽略Accuracy属性,并像该问题的另一个答案所描述的那样,向类添加一个额外的int属性。
使用XmlEnumAttribute意味着只需要修改枚举本身,并且无论在何处使用,它都将xml序列化为int。
    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
    }

我更喜欢这个答案,而不是Saunders的答案。 - Allen Rice
那么标志枚举呢?使用这种方法是否可以序列化标志组合? - fibriZo raZiel
@fibriZo 不是的,请参见https://dev59.com/Z3RB5IYBdhLWcg3wz6QJ - DerApe

3

我相信你需要在枚举上使用[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;}
    }
}

请注意,XML序列化器不使用[Serializable]
此外,请注意AccuracyLevelInt属性可能实现不正确。我正在研究这个问题。

这个方法可以实现,但我希望避免创建另一个属性(也许通过GeoCoordinate.Accurate上的Xml属性,但似乎这并不存在)。 - Karmic Coder

1

使用[Serializable][DataContract]修饰枚举。这两个属性之间存在一些差异,请确保您查看了它们(此博客文章可能会有所帮助)。并使用[EnumMember]标记各个枚举项。我从未检查过传输中的枚举长什么样,但这样做将确保它到达另一端,并确保在生成客户端代理时它被捕获。


这些选项似乎都无法改变该字段序列化的方式。 - Karmic Coder
是的,我认为在使用WCF时没有区别,但如果你要序列化到XML,那就有区别了。我希望有人能够简单地给出区别的要点解释。 - slugster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接