2010-01-12 144 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