2010-01-12 18 views
6

Estoy buscando devolver la siguiente clase a través de un servicio web, que incluye un tipo de enumeración como uno de sus miembros.Serialize enum como 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;} 
    } 
} 

Esto funciona correctamente, pero devolverá un resultado en forma de:

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

En lugar de una cadena que representa la enumeración, me gustaría que simplemente devuelve un número entero. ¿Se puede hacer esto sin cambiar el tipo de GeoCoordinate.Accuracy?

+0

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

Respuesta

4

Aunque es un truco, consideré usar XmlEnumAttribute en cada uno de los miembros enum para ser más capaz de paliar en este caso. Si esta enumeración fuera mucho más grande, probablemente sería mejor usar XmlIgnore en la propiedad Accuracy y agregar una propiedad int adicional a la clase como se describe en otra respuesta a esta pregunta.

El uso de XmlEnumAttribute significa que solo la enumeración necesita ser modificada, y xml se serializará como un int cuando se use.

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

Prefiero esto más que la respuesta de Saunderses –

+0

¿Y qué hay de Flag Enums? ¿Es posible serializar combinaciones de banderas usando este método? –

+0

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

1

Decora la enumeración con [Serializable] o [DataContract]. Hay algunas diferencias entre los dos atributos, asegúrese de verificarlo (this blog post puede ayudar con eso). Y marque los elementos enum individuales con [EnumMember]. Nunca he revisado el aspecto de la enumeración en tránsito, pero al hacerlo me aseguraré de que llegue al otro extremo y también me aseguraré de que se recoja si genera un proxy del lado del cliente.

+0

'' DataContract' y EnumMember' siempre ha trabajado para mi. – Nate

+0

Ninguna de estas opciones parece cambiar la manera en que se serializa este campo. –

+0

Sí, creo que cuando se trata de WCF no hace ninguna diferencia, ¿pero si se serializa en XML? Daría la bienvenida a cualquiera que brinde una explicación simple de las diferencias. – slugster

3

Creo que usted tendrá que utilizar [XmlIgnore] en la enumeración, y crear una segunda propiedad que devuelve el valor entero:

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

Tenga en cuenta que [Serializable] no es utilizado por el serializador XML.

Además, tenga en cuenta que la propiedad AccuracyLevelInt probablemente se haya implementado incorrectamente. Estoy investigando eso ahora.

+0

Esto funcionaría, pero esperaba evitar la creación de otra propiedad (tal vez a través de un atributo Xml en GeoCoordinate. Exacto, pero parece que esto no existe.) –