utilizar example enum como acceder .net enums xml-serialization

.net - example - return enum c#



¿Cómo serializo un valor enum como un int? (6)

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:

<?xml version="1.0" encoding="utf-16"?> <Request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <request>Confirmation</request> </Request>

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


Consulte el ejemplo completo del programa 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:

<Request xmlns="petermcg.wordpress.com" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <request>2</request> </Request>

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


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.


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í:

<CustomClass> <EnumValue>2</EnumValue> </CustomClass>


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.


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í.