简体   繁体   English

反序列化枚举

[英]deserializing enums

I have an xml in which one of the elements has an attribute that can be blank. 我有一个xml,其中一个元素的属性可以为空。 For eg, 例如,

<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 我该如何处理这种情况

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

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 . 有关更多信息,请参阅此处

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

      .
      .
      .
   }
}

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. 由于枚举是不可为空的值类型,因此无法将空值映射到空引用。

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. 它叫做Null-Coalescing运算符 ,当我想要一个null输入的默认值时我会使用它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM