Comment sérialiser une valeur enum en tant que int?

Je veux sérialiser ma valeur d’énumération en tant qu’int mais je n’ai que le nom.

Voici ma classe (en exemple) et enum:

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

Et le code (juste pour être sûr que je ne le fais pas mal)

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

Cette réponse (à une autre question) semble indiquer que les énumérations devraient se sérialiser en ints par défaut, mais cela ne semble pas le faire. Voici ma sortie:

   Confirmation  

J’ai pu sérialiser comme valeur en mettant un atsortingbut “[XmlEnum (” X “)]” sur chaque valeur, mais cela semble juste faux.

La plupart du temps, les gens veulent des noms, pas des ints. Vous pourriez append une propriété de cale à cet effet?

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

Ou vous pouvez utiliser IXmlSerializable , mais c’est beaucoup de travail.

Le plus simple est d’utiliser l’atsortingbut [XmlEnum] comme suit:

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

Cela va se sérialiser en XML (disons que la classe parente est CustomClass) comme ceci:

  2  

Reportez-vous à l’exemple complet du programme d’application de la console ci-dessous pour trouver un moyen intéressant de réaliser ce que vous recherchez en utilisant 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(ssortingng[] 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); } } } 

Le contenu de request.txt est le suivant après l’appel à WriteObject:

  2  

Vous aurez besoin d’une référence à l’assembly System.Runtime.Serialization.dll pour 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 } 

L’approche ci-dessus a fonctionné pour moi.

Étant donné que vous atsortingbuez des valeurs non séquentielles explicites aux options enum, je suppose que vous souhaitez pouvoir spécifier plus d’une valeur à la fois (indicateurs binarys), la réponse acceptée est votre seule option. Passage en pré-réservation | PreBookingConfirmation aura une valeur entière de 9 et le sérialiseur ne pourra pas le désérialiser, le lancer avec une propriété shim fonctionnera bien. Ou peut-être vous venez de manquer la valeur 3 🙂

Jetez un coup d’oeil à la classe System.Enum. La méthode Parse convertit une représentation chaîne ou int en object Enum et la méthode ToSsortingng convertit l’object Enum en une chaîne pouvant être sérialisée.