2010-01-12 16 views
6

Sto cercando di restituire la classe seguente tramite un servizio Web, che include un tipo enum come uno dei suoi membri.Serialize enum 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;} 
    } 
} 

Ciò funziona correttamente, ma restituisce un risultato sotto forma di:

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

Invece di una stringa che rappresenta l'enumerazione, desidero per tornare semplicemente un intero. Questo può essere fatto senza cambiare il tipo di GeoCoordinate.Accuracy?

+0

Duplicate: http://stackoverflow.com/questions/506368/how-do-i-serialize-an-enum-value-as-an-int –

risposta

4

Anche se si tratta di un hack, ho ritenuto che utilizzare XmlEnumAttribute su ciascuno dei membri di enum fosse il più facile in questo caso. Se questa enumerazione fosse molto più grande, sarebbe probabilmente meglio usare XmlIgnore nella proprietà Accuracy e aggiungere una proprietà int aggiuntiva alla classe come descritto in un'altra risposta a questa domanda.

Usng XmlEnumAttribute significa che solo l'enum stesso deve essere modificato e serializzerà xml come un int dove viene utilizzato.

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

Preferisco questa risposta a Saunderses –

+0

E a proposito di Flag Enums? È possibile serializzare le combinazioni di flag usando questo metodo? –

+0

@fibriZo no, vedere http://stackoverflow.com/questions/506368/how-do-i-serialize-an-enum-value-as-an-int – derape

1

Decora l'enumerazione con [Serializable] o [DataContract]. Ci sono alcune differenze tra i due attributi, assicurati di controllare (this blog post può aiutare con quello). E segna i singoli oggetti enumer con [EnumMember]. Non ho mai controllato l'aspetto dell'enumerazione durante il transito, ma facendo ciò garantiremo che arrivi dall'altra parte e garantiremo che venga rilevato se si genera un proxy lato client.

+0

'' DataContract' e EnumMember' ha sempre lavorato per me. – Nate

+0

Nessuna di queste opzioni sembra cambiare il modo in cui questo campo viene serializzato. –

+0

Sì, penso che quando si tratta di WCF non faccia alcuna differenza, ma lo fa se si sta serializzando su XML? Darei il benvenuto a chiunque dia una spiegazione semplice delle differenze. – slugster

3

Credo che sarà necessario utilizzare [XmlIgnore] sul enum, e creare una seconda proprietà che restituisce il valore intero:

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

Nota che [Serializable] non viene utilizzato dal Serializzatore XML.

Inoltre, si noti che la proprietà AccuracyLevelInt è probabilmente implementata in modo errato. Sto esaminando questo ora.

+0

Funzionerebbe, ma speravo di evitare di creare un'altra proprietà (magari tramite un attributo Xml su GeoCoordinate.Accurato, ma sembra che questo non esista.) –