1. ホーム
  2. .net

enumの値をint型としてシリアライズするにはどうしたらいいですか?

2023-10-03 08:39:12

質問

enum-valueをint型としてシリアライズしたいのですが、名前しか取得できません。

以下は私の(サンプルの)クラスとenumです。

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();

この回答 (は、enumがデフォルトで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")]" 属性を付けることによって、値としてシリアライズすることができましたが、これはちょうど間違っているようです。

どのように解決するのですか?

たいていの場合、人々は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 を使うこともできますが、これはたくさんの作業が必要です。