13

Tengo un problema al deserializar algunos XML; el XML suministrado por un tercero es bastante detallado, por lo que si no hay ningún valor establecido para un elemento en particular, proporcionará y vaciará el elemento (por ejemplo, <element1 />).Usar decoraciones XML para especificar valores predeterminados durante la deserialización

Esto es un problema para ciertos elementos, por ejemplo, aquellos que están destinados a almacenar enteros. Tengo control sobre el tercero, así que puedo hacer que especifiquen un valor predeterminado (<myinteger>0</myinteger>) o puedo hacer que omitan estos elementos por completo. Ambos deberían evitar el problema.

Sin embargo, puede haber situaciones en el futuro, donde no tenemos tanto control, en cuyo caso, ¿hay alguna manera de especificar, tal vez a través de una decoración, un valor predeterminado?

[XmlElement("myinteger")=0???] 
    public int MyInteger 
    { 
     get 
     { 
      return myInteger; 
     } 
     set 
     { 
      myInteger= value; 
     } 
    } 

Respuesta

32

XmlSerializerhace apoyo [DefaultValue], pero lo utiliza durante la serialización . Durante deserialization, simplemente ejecuta el constructor, luego toma los valores entrantes y los aplica. Un enfoque común es, entonces, utilizar el constructor (o en el campo-inicializadores):

public Foo() { 
    Bar = 4; 
} 
[DefaultValue(4), XmlAttribute("bar")] 
public int Bar {get;set;} 

Sin embargo; La interpretación de XmlSerializer de esto no es "proporcionar un elemento vacío", sino más bien "omitir el elemento (/ atributo)". Incluso int? no se asigna a "vacío". Para manejar elementos vacíos, debería manejarlo como una cadena. Que es feo

+1

Hmmmm ... simplemente que el tercero omita elementos vacíos de una descripción parece la solución más fácil. Solo tenía curiosidad por saber qué podía hacer y no tenía el lujo de esa elección. Consideré la opción de cadena, pero es solo una gran cantidad de lombrices ... – CJM

+0

Hay al menos un efecto importante durante la deserialización. Si el elemento está vacío, sin DefaultValue puede haber un error de análisis. Sin embargo, con él, el [código generado] (http://msdn.microsoft.com/en-us/library/aa302290.aspx) omitirá el elemento vacío. –

0

La decoración con [DefaultValue] no parece ser una solución completa, ya que no funciona siempre. Otra solución simple (puede no estar limpio)

public string _sourceSubFolderName; 
    [DefaultValueAttribute("")] 
    [XmlElement("SourceSubFolderName")] 
    public string SourceSubFolderName 
    { 
     get { return string.IsNullOrEmpty(_sourceSubFolderName) ? 
       string.Empty : _sourceSubFolderName; } 
     set { _sourceSubFolderName = value; } 
    } 
Cuestiones relacionadas