2010-11-22 23 views
12

Tengo un xml en el que uno de los elementos tiene un atributo que puede estar en blanco. Por ejemplo,deserializing enums

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

Ahora, el lenguaje es tipo de enumeración de las clases creadas a partir del esquema. Funciona bien si se especifica el idioma, no se puede deserializar si está en blanco (como se muestra en el ejemplo).

Editar: Código de deserialización:

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

¿Cómo se puede manejar que este escenario

+0

Se puede publicar su código deserialización? –

Respuesta

14

Se podría declarar la propiedad de enumeración como anulable:

public Language? Language { get; set; } 


EDIT: OK, he intentado, no funciona para los atributos ... Aquí hay otro opción: no serializar/deserializar esta propiedad directamente, sino serializar una propiedad de cadena en su lugar:

[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); 
     } 
    } 
} 
+0

TI da error "Error al reflejar el tipo" !! – genericuser

+0

Eso también significa que puede almacenar un valor nulo allí, lo que es una mala encapsulación en mi humilde opinión. En este caso, es mejor proporcionar un valor que no sea nulo, y convertirlo en un valor de defeault en el setter. –

+0

@Priya, ver mi respuesta actualizada –

2

¿Qué le gustaría que el resultado sea?

Un valor en blanco no se puede correlacionar con una referencia nula, ya que una enumeración es un tipo de valor que no admite nulos.

+0

sí, lo sé. pero estoy pensando en lo que puede ser la solución para el mismo. – genericuser

0
object wontBeNull = couldBeNull ?? defaultIfNull; 

Es lo que probaría. Se llama Null-Coalescing operator, lo uso cuando quiero un valor predeterminado para la entrada nula.

+0

No estoy seguro de cómo implementar esto. Tengo una propiedad del tipo enum, que debería deserializarse. ¿Cómo menciono esto en la propiedad cuando lo declaro? – genericuser

+0

Hablando en serio, ¿ha considerado un bloque try-catch? Si coloca uno alrededor de su deserialización, puede detectar muchos errores y archivos XML con formato incorrecto. –

14

Probablemente necesite marcar su enumeración y agregar un elemento predeterminado que represente Desconocido.

Por ejemplo:

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

Para obtener más información, consulte here.

12

Usted puede hacerlo de esta manera:

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

     . 
     . 
     . 
    } 
}