Сериализировать enum как int - PullRequest
6 голосов
/ 13 января 2010

Я хочу вернуть следующий класс через веб-сервис, который включает тип enum в качестве одного из его членов.

[Serializable, XmlRoot("GeoCoordinate")]
public class GeoCoordinate
{
    public enum AccuracyLevel
    {
        Unknown = 0,
        Country = 1,
        Region = 2,
        SubRegion = 3,
        Town = 4,
        PostalCode = 5,
        Street = 6,
        Intersection = 7,
        Address = 8,
        Premise = 9
    }

    private AccuracyLevel _accuracy;

    // ... more members


    public AccuracyLevel Accuracy
    {
        get { return _accuracy; } 
        set { _accuracy = value;}
    }
}

Это работает правильно, но вернет результат в виде:

<!-- ... -->
<Accuracy>Unknown or Country or Region or SubRegion or Town or 
  PostalCode or Street or Intersection or Address or Premise</Accuracy>
<!-- ... -->

Вместо строки, представляющей перечисление, я бы хотел, чтобы она просто возвращала целое число. Можно ли это сделать без изменения типа GeoCoordinate.Accuracy?

Ответы [ 3 ]

4 голосов
/ 13 января 2010

Несмотря на то, что это хак, я считаю, что использование XmlEnumAttribute на каждом из членов перечисления является наиболее неприятным в этом случае. Если бы это перечисление было намного больше, вероятно, было бы лучше использовать XmlIgnore для свойства Accuracy и добавить дополнительное свойство int к классу, как описано в другом ответе на этот вопрос.

Usng XmlEnumAttribute означает, что нужно изменить только само перечисление, и он будет сериализован в xml как int везде, где он используется.

    public enum AccuracyLevel
    {
        [XmlEnum("0")] Unknown = 0,
        [XmlEnum("1")] Country = 1,
        [XmlEnum("2")] Region = 2,
        [XmlEnum("3")] SubRegion = 3,
        [XmlEnum("4")] Town = 4,
        [XmlEnum("5")] PostalCode = 5,
        [XmlEnum("6")] Street = 6,
        [XmlEnum("7")] Intersection = 7,
        [XmlEnum("8")] Address = 8,
        [XmlEnum("9")] Premise = 9
    }
3 голосов
/ 13 января 2010

Полагаю, вам нужно использовать [XmlIgnore] в перечислении и создать второе свойство, которое возвращает целочисленное значение:

[XmlRoot("GeoCoordinate")]
public class GeoCoordinate
{
    public enum AccuracyLevel
    {
        Unknown = 0,
        Country = 1,
        Region = 2,
        SubRegion = 3,
        Town = 4,
        PostalCode = 5,
        Street = 6,
        Intersection = 7,
        Address = 8,
        Premise = 9
    }

    private AccuracyLevel _accuracy;

    // ... more members


    [XmlIgnore]
    public AccuracyLevel Accuracy
    {
        get { return _accuracy; } 
        set { _accuracy = value;}
    }

    [XmlElement("AccuracyLevel")]
    public int AccuracyLevelInt
    {
        get {return (int) AccuracyLevel;}
        set {AccuracyLevel = (AccuracyLevel) value;}
    }
}

Обратите внимание, что [Serializable] не используется сериализатором XML.

Также обратите внимание, что свойство AccuracyLevelInt, вероятно, реализовано неправильно. Я смотрю на это сейчас.

1 голос
/ 13 января 2010

Украсить перечисление с [Serializable] или [DataContract]. Между этими двумя атрибутами есть некоторые различия, обязательно проверьте их ( этот пост может помочь в этом). И пометьте отдельные элементы перечисления с [EnumMember]. Я никогда не проверял, как выглядит enum при передаче, но сделав это, мы гарантируем, что он попадет на другой конец, а также, что он будет получен, если вы сгенерируете прокси на стороне клиента.

...