deserializing enums

2019-01-25 06:04发布

I have an xml in which one of the elements has an attribute that can be blank. For e.g.,

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

Now, language is enum type in the classes created from the schema. It works fine if the language is specified, it fails to deserialize if it is blank (as shown in example).

Edit: Code for deserialization:

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

How can I handle this scenario

5条回答
太酷不给撩
2楼-- · 2019-01-25 06:35

You probably need to mark up your enumeration, and add a default item that represents Unknown.

For example:

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

For more information, see here.

查看更多
放荡不羁爱自由
3楼-- · 2019-01-25 06:40
object wontBeNull = couldBeNull ?? defaultIfNull;

Is what I'd try. It's called Null-Coalescing operator, I use it when I want a default for null input.

查看更多
forever°为你锁心
4楼-- · 2019-01-25 06:42

You could declare the enum property as nullable:

public Language? Language { get; set; }


EDIT: ok, I just tried, it doesn't work for attributes... Here's another option: don't serialize/deserialize this property directly, but serialize a string property instead :

[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);
        }
    }
}
查看更多
虎瘦雄心在
5楼-- · 2019-01-25 06:55

You can do it this way:

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; }
      }

      .
      .
      .
   }
}
查看更多
干净又极端
6楼-- · 2019-01-25 06:57

What would you want the result to be ?

A blank value cannot be mapped to a null reference since an enum is a non-nullable value type.

查看更多
登录 后发表回答