Сериализируйте перечисление как интервал

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

[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?

6
задан Karmic Coder 12 January 2010 в 21:05
поделиться

3 ответа

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

Использование 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
    }
4
ответ дан 16 December 2019 в 21:40
поделиться

Что вам больше всего нужно:

  1. Возможность убедиться, что кто-то не унаследовал от вашего класса, ИЛИ
  2. Возможность убедиться, что ваш код тестируется с помощью вашей насмешливой рамки выбора?

Как правило, я считаю, что вам не нужно применять (1). Для меня проверяемость (2) гораздо важнее. Что лучше всего подходит для вашей ситуации?

-121--2959435-

No. Правильная структура проектов. Попробуйте использовать какой-то порядок, основанный на абстракции - от низкого уровня до высокого уровня.

-121--1369898-

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

1
ответ дан 16 December 2019 в 21:40
поделиться

Я считаю, что вам нужно использовать [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 , вероятно, реализовано неправильно. Я сейчас занимаюсь этим.

3
ответ дан 16 December 2019 в 21:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: