¿Cómo serializo un valor enum como un int?

Quiero serializar mi valor enum como int, pero solo obtengo el nombre.

Aquí está mi clase (de muestra) y enum:

public class Request { public RequestType request; } public enum RequestType { Booking = 1, Confirmation = 2, PreBooking = 4, PreBookingConfirmation = 5, BookingStatus = 6 } 

Y el código (solo para estar seguro de que no lo estoy haciendo mal)

 Request req = new Request(); req.request = RequestType.Confirmation; XmlSerializer xml = new XmlSerializer(req.GetType()); StringWriter writer = new StringWriter(); xml.Serialize(writer, req); textBox1.Text = writer.ToString(); 

Esta respuesta (a otra pregunta) parece indicar que las enumeraciones deben serializarse a los valores por defecto, pero no parece hacer eso. Aquí está mi resultado:

   Confirmation  

Pude serializar como el valor al poner un atributo “[XmlEnum (” X “)]” en cada valor, pero esto parece incorrecto.

La mayoría de las veces, la gente quiere nombres, no enteros. ¿Podría agregar una propiedad shim para este propósito?

 [XmlIgnore] public MyEnum Foo {get;set;} [XmlElement("Foo")] [EditorBrowsable(EditorBrowsableState.Never), Browsable(false)] public int FooInt32 { get {return (int)Foo;} set {Foo = (MyEnum)value;} } 

O podrías usar IXmlSerializable , pero eso es mucho trabajo.

La forma más fácil es usar el atributo [XmlEnum] de la siguiente manera:

 [Serializable] public enum EnumToSerialize { [XmlEnum("1")] One = 1, [XmlEnum("2")] Two = 2 } 

Esto se serializará en XML (supongamos que la clase padre es CustomClass) así:

  2  

Consulte el ejemplo completo del progtwig de aplicación de consola a continuación para obtener una forma interesante de lograr lo que está buscando utilizando DataContractSerializer:

 using System; using System.IO; using System.Runtime.Serialization; namespace ConsoleApplication1 { [DataContract(Namespace="petermcg.wordpress.com")] public class Request { [DataMember(EmitDefaultValue = false)] public RequestType request; } [DataContract(Namespace = "petermcg.wordpress.com")] public enum RequestType { [EnumMember(Value = "1")] Booking = 1, [EnumMember(Value = "2")] Confirmation = 2, [EnumMember(Value = "4")] PreBooking = 4, [EnumMember(Value = "5")] PreBookingConfirmation = 5, [EnumMember(Value = "6")] BookingStatus = 6 } class Program { static void Main(string[] args) { DataContractSerializer serializer = new DataContractSerializer(typeof(Request)); // Create Request object Request req = new Request(); req.request = RequestType.Confirmation; // Serialize to File using (FileStream fileStream = new FileStream("request.txt", FileMode.Create)) { serializer.WriteObject(fileStream, req); } // Reset for testing req = null; // Deserialize from File using (FileStream fileStream = new FileStream("request.txt", FileMode.Open)) { req = serializer.ReadObject(fileStream) as Request; } // Writes True Console.WriteLine(req.request == RequestType.Confirmation); } } } 

El contenido de request.txt es el siguiente después de la llamada a WriteObject:

  2  

Necesitará una referencia al ensamblado System.Runtime.Serialization.dll para DataContractSerializer.

 using System.Xml.Serialization; public class Request { [XmlIgnore()] public RequestType request; public int RequestTypeValue { get { return (int)request; } set { request=(RequestType)value; } } } public enum RequestType { Booking = 1, Confirmation = 2, PreBooking = 4, PreBookingConfirmation = 5, BookingStatus = 6 } 

El enfoque anterior funcionó para mí.

Dado que está asignando valores explícitos no secuenciales a las opciones enum, asumo que desea poder especificar más de un valor a la vez (indicadores binarios), entonces la respuesta aceptada es su única opción. Pasando en PreBooking | PreBookingConfirmation tendrá un valor entero de 9 y el serializador no podrá deserializarlo, pero lo fundirá con una propiedad shim pero funcionará bien. O tal vez solo te perdiste el 3 valor 🙂

Eche un vistazo a la clase System.Enum. El método Parse convierte una cadena o una representación int en el objeto Enum y el método ToString convierte el objeto Enum en una cadena que se puede serializar.