如何序列化一个枚举值作为一个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(); 

这个答案 (对另一个问题)似乎表明,枚举应该序列化为默认的整数,但似乎并没有这样做。 这是我的输出:

 <?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“)]”属性来序列化为值,但是这看起来似乎是错误的。

大多数时候,人们想要的是名字,而不是整数。 您可以添加一个垫片属性的目的?

 [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.txt的内容如下所示:

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

您将需要对DataContractSerializer的System.Runtime.Serialization.dll程序集的引用。

 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 } 

上面的方法为我工作。

既然你正在分配明确的非顺序值的枚举选项,我假设你想能够一次指定多个值(二进制标志),那么接受的答案是唯一的select。 通过PreBooking | PreBookingConfirmation将有一个整数值为9和序列化程序将无法反序列化,使用填充属性投它,但将工作正常。 或者,也许你错过了3的价值:)

看看System.Enum类。 Parse方法将string或int表示转换为Enum对象,ToString方法将Enum对象转换为可序列化的string。