десериализация перечислений - PullRequest
17 голосов
/ 23 ноября 2010

У меня есть XML, в котором один из элементов имеет атрибут, который может быть пустым. Например,

<tests>
<test language="">
.....
</test>
</tests>

Теперь язык относится к типу enum в классах, созданных из схемы. Он отлично работает, если указан язык, не может десериализоваться, если он пустой (как показано в примере).

Редактировать: Код для десериализации:

XmlSerializer xmlserializer = new XmlSerializer(type);
StringReader strreader = new StringReader(stringXML);
Object o = serializer.Deserialize(strreader);

Как мне справиться с этим сценарием

Ответы [ 5 ]

20 голосов
/ 23 ноября 2010

Вы можете объявить свойство enum как обнуляемое:

public Language? Language { get; set; }


РЕДАКТИРОВАТЬ: хорошо, я только что попробовал, это не работает для атрибутов ... Вот еще один вариант: не сериализуйте / десериализуйте это свойство напрямую, а вместо этого сериализуйте свойство строки:

[XmlIgnore]
public Language Language { get; set; }

[XmlAttribute("Language")]
public string LanguageAsString
{
    get { return Language.ToString(); }
    set
    {
        if (string.IsNullOrEmpty(value))
        {
            Language = default(Language);
        }
        else
        {
            Language = (Language)Enum.Parse(typeof(Language), value);
        }
    }
}
15 голосов
/ 23 ноября 2010

Возможно, вам нужно разметить ваше перечисление и добавить элемент по умолчанию, представляющий Неизвестно.

Например:

Public Enum EmployeeStatus
   <XmlEnum("")> Unknown = 0
   <XmlEnum("Single")> One = 1
   <XmlEnum("Double")> Two = 2
   <XmlEnum("Triple")> Three = 3
End Enum

Для получения дополнительной информации см. здесь .

13 голосов
/ 30 августа 2011

Вы можете сделать это так:

namespace Example
{

   public enum Language
   {
     [XmlEnum("en")]
     English,

     [XmlEnum("de")]
     Deutsch
   }

   public class ExampleClass
   {

      private Language? language;

      [XmlAttribute("Language")]
      public Language Language
      {
         get { return language ?? Example.Language.English; }
         set { language = value; }
      }

      .
      .
      .
   }
}
2 голосов
/ 23 ноября 2010

Что бы вы хотели, чтобы был результат?

Пустое значение не может быть сопоставлено с нулевой ссылкой, так как перечисление является ненулевым типом значения.

0 голосов
/ 23 ноября 2010
object wontBeNull = couldBeNull ?? defaultIfNull;

Это то, что я бы попробовал. Он называется Оператор нуль-коалесцирования , я использую его, когда хочу использовать значение по умолчанию для нулевого ввода.

...