78

enum-value を 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();

この回答(別の質問に対する) は、列挙型がデフォルトで int にシリアル化されるべきであることを示しているようですが、そうではないようです。ここに私の出力があります:

<?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")]」属性を付けることで値としてシリアル化できましたが、これは間違っているようです。

4

6 に答える 6

72

ほとんどの場合、人々はintではなく名前を望んでいます。目的のためにシムプロパティを追加できますか?

[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が、それは多くの作業です。

于 2009-02-03T08:53:33.543 に答える
13

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 アセンブリへの参照が必要です。

于 2009-02-03T09:51:49.200 に答える
0

System.Enum クラスを見てください。Parse メソッドは文字列または int 表現を Enum オブジェクトに変換し、ToString メソッドは Enum オブジェクトをシリアル化可能な文字列に変換します。

于 2009-02-03T09:05:03.130 に答える
0

enumオプションに明示的な非連続値を割り当てているため、一度に複数の値を指定できるようにしたいと考えています(バイナリフラグ)。受け入れられた答えが唯一のオプションです。事前予約で渡す | PreBookingConfirmation は 9 の整数値を持ち、シリアライザーはそれをデシリアライズできず、shim プロパティでキャストしますが、うまく機能します。または、3 つの値を見逃しただけかもしれません :)

于 2012-02-08T08:40:51.087 に答える