2012-03-30 18 views
12

¿Es posible deserializar una enumeración de un int en C#. p.ej. Si tengo la clase siguiente:C# deserializing enumeraciones de enteros

class Employee 
{ 
    public string Name { get; set;} 
    public int EmployeeTypeID { get; set;} 
} 

que puede crear fácilmente esto desde XML

<Employee> 
     <Name>Joe Bloggs</Name> 
     <EmployeeTypeID>1</EmployeeTypeID> 
    </Employee> 

usar algo como esto:

Employee employee = (Employee)new XmlSerializer(typeof(Employee)).Deserialize(XmlReader); 

Con muy poco trabajo en cuestión, esto me permite utilizo un servicio genérico que puedo usar para todos los objetos de la base de datos alimentando un comando de selección, una cadena de conexión y un tipo para recuperar una matriz de objetos sin necesidad de mapeo adicional. Sin embargo, me he despegado con enumeraciones. Suponiendo ahora en lugar de ser un EmployeeType entero es una enumeración:

public enum EmployeeTypeEnum 
{ 
    Admin = 1, 
    Sales = 2 
} 

así que mi clase se convierte en:

class Employee 
{ 
    public string Name { get; set;} 
    public EmployeeTypeEnum EmployeeTypeID { get; set;} 
} 

¿Puedo usar el mismo XML y hacer C# reconocen que el valor int de EmployeeTypeID en el xml debe corresponder con el valor int de la enumeración? Hay otras preguntas similares que existen, pero ninguna tiene una respuesta muy satisfactoria, son bastante antiguas e implican cambios al código mayoristas. Estoy esperando una solución mejor ...

Como posible nota aparte (y un poco anticipándose a algunas respuestas), ¿está utilizando enums para esto una práctica que es mejor evitar? ¿Debería usar pares clave-valor? Siempre usaría pares clave-valor (o similar) si hubiera cambios, pero en este caso EmployeeType es fijo y nunca cambiará.

+1

+1 - una de esas preguntas con las que no puedo demostrar el uso, pero espero ver la respuesta. – SkonJeet

+2

¿Tiene http://stackoverflow.com/questions/506368/how-doi-i-serialize-an-enum-value-as-an-int ayuda? – Bridge

+0

O http://stackoverflow.com/questions/4250656/deserializing-enums? – kerrubin

Respuesta

18

Teóricamente (= Yo no lo he probado), añadiendo el atributo XmlEnum a sus valores de enumeración debe hacer el truco:

public enum EmployeeTypeEnum 
{ 
    [XmlEnum("1")] Admin = 1, 
    [XmlEnum("2")] Sales = 2 
} 

Esto le dice XmlSerializer que un valor de EmployeeTypeEnum.Admin es ser serializado como la cadena 1y viceversa (que es lo que necesita).

En cuanto a su nota: no veo el uso de enumeraciones aquí como un problema. Si los valores en la base de datos son enteros y tienen un significado fijo, las enumeraciones son una buena solución y, además, sirven como documentación para los valores de la base de datos.

3

Si XML es en este formato:

<Employee> 
    <Name>Shiv</Name> 
    <EmployeeTypeID>Sales</EmployeeTypeID> 
</Employee> 

Funcionará como se muestran. Si usted adorna su enumeración con el atributo XmlEnum así:

public enum EmployeeTypeEnum 
{ 
    [XmlEnum("1")] 
    Admin = 1, 
    [XmlEnum("2")] 
    Sales = 2 
} 

continuación, puede utilizar valores enteros en el archivo XML y se va a proyectar en la enumeración automágicamente.

Personalmente, prefiero usar enumeraciones en casos como este. Incluso si los elementos en la enumeración pueden aumentar con el tiempo, prefiero usar enumeraciones. De hecho, tales enumeraciones se generan a partir de códigos de la base de datos, por lo que en el código no se trabaja con Ids (mucho más legible).

0

En el archivo xml, use la constante con nombre en lugar del valor entero. Funcionará bien.

<Employee> 
     <Name>Joe Bloggs</Name> 
     <EmployeeTypeID>Admin</EmployeeTypeID> 
</Employee>