2010-01-12 115 views
6

我正在寻找通过一个Web服务,其中包括一个枚举类型作为其成员之一返回以下类。Serialize枚举为int

[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的类型的情况下完成吗?

+0

重复:http://stackoverflow.com/questions/506368/how-do-i-serialize-an-enum-value-as-an-int – 2010-01-13 14:24:12

回答

4

虽然这是一个黑客,我认为使用XmlEnumAttribute对每个枚举成员在这种情况下是最可取的。如果这个枚举要大得多,那么在Accuracy属性上使用XmlIgnore可能会更好,并按照此问题的另一个答案中所述向该类添加其他int属性。

Usng XmlEnumAttribute意味着只有enum本身需要修改,并且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 
    } 
+0

我比Saunderses更喜欢这个答案 – 2010-01-26 20:53:26

+0

Flag Enums又如何呢?是否有可能使用此方法序列化标志组合? – 2015-09-17 11:28:11

+0

@fibriZo不,请参阅http://stackoverflow.com/questions/506368/how-do-i-serialize-an-enum-value-as-an-int – derape 2016-10-24 08:46:41

1

[Serializable][DataContract]装饰枚举。这两个属性之间有一些区别,请确保检查出来(this blog post可能有帮助)。并用[EnumMember]标记各个枚举项。我从来没有检查枚举在传输过程中的样子,但是这样做将确保它到达另一端,并且还会确保在生成客户端代理时它会被拾取。

+0

'DataContract'和'EnumMember'一贯致力于为了我。 – Nate 2010-01-12 21:44:15

+0

这些选项似乎都不会改变此字段序列化的方式。 – 2010-01-12 21:44:20

+0

是的,我认为当涉及到WCF时,它没有什么区别,但是如果你要序列化为XML呢?我会欢迎任何人提供一个简单的项目符号解释差异。 – slugster 2010-01-13 00:01:56

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;} 
    } 
} 

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

此外,请注意AccuracyLevelInt属性可能实现不正确。我现在正在研究这个问题。

+0

这会工作,但我希望避免创建另一个属性(可能通过GeoCoordinate.Accurate上的Xml属性,但它似乎不存在)。 – 2010-01-13 13:57:37