Как сериализовать значение перечисления как int?
Я хочу сериализовать свое значение перечисления как int, но я получаю только имя.
вот мой (пример) класс и перечисление:
public class Request {
public RequestType request;
}
public enum RequestType
{
Booking = 1,
Confirmation = 2,
PreBooking = 4,
PreBookingConfirmation = 5,
BookingStatus = 6
}
и код (просто чтобы убедиться, что я не делаю это неправильно)
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();
этот ответ (на другой вопрос), похоже, указывает на то, что перечисления должны сериализоваться в ints по умолчанию, но это, похоже, не так. Вот мой вывод:
<?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>
я смог сериализовать как значение, поставив "[XmlEnum ("X")]" атрибут на каждое значение, но это просто кажется неправильным.
6 ответов:
большую часть времени люди хотят имена, а не ints. Вы можете добавить свойство прокладки для этой цели?
[XmlIgnore] public MyEnum Foo {get;set;} [XmlElement("Foo")] [EditorBrowsable(EditorBrowsableState.Never), Browsable(false)] public int FooInt32 { get {return (int)Foo;} set {Foo = (MyEnum)value;} }или вы могли бы использовать
IXmlSerializable, но это много работы.
самый простой способ-использовать атрибут [XmlEnum] следующим образом:
[Serializable] public enum EnumToSerialize { [XmlEnum("1")] One = 1, [XmlEnum("2")] Two = 2 }это будет сериализоваться в XML (скажем, что родительский класс CustomClass) вот так:
<CustomClass> <EnumValue>2</EnumValue> </CustomClass>
пожалуйста, смотрите полный пример консольного приложения ниже для интересного способа достижения того, что вы ищете с помощью 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); } } }содержание запроса.тхт следующим образом после вызова метода writeobject:
<Request xmlns="petermcg.wordpress.com" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <request>2</request> </Request>вам понадобится ссылка на систему.Во время выполнения.Сериализация.DLL-сборки для сериализатора 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 }выше подход работал для меня.
поскольку вы присваиваете явные непересекающиеся значения параметрам перечисления, я предполагаю, что вы хотите иметь возможность указывать более одного значения за раз (двоичные флаги), то принятый ответ является вашим единственным вариантом. Передача в PreBooking / PreBookingConfirmation будет иметь целочисленное значение 9, и сериализатор не сможет десериализовать его, однако он будет хорошо работать с свойством shim. Или может быть, вы просто пропустили 3 значения :)
взгляните на систему.Перечисление класса. Метод Parse преобразует представление string или int в объект Enum, а метод ToString преобразует объект Enum в строку, которая может быть сериализована.
Comments