2010-02-28 13 views
5

Estoy en lo cierto en la comprensión del .NET XmlIgnoreAttribute, que dice:XmlIgnoreAttribute, solo se usa durante la serialización, ¿no durante la deserialización?

Encarga el método Serialize de la XmlSerializer no serializar el ámbito público o público de lectura/escritura de valor de la propiedad.

que:

  • La propiedad será deserialized, si está presente en el archivo XML?
  • ¿La propiedad no se serializará en un nuevo archivo XML?

La razón por la que estoy preguntando es que he reemplazado una propiedad en el archivo con una nueva con más opciones. La propiedad anterior era una propiedad booleana simple, y la nueva es una enumeración. Cambié la propiedad anterior para que convierta el valor de la nueva propiedad en un valor booleano, según lo que significaba la propiedad anterior antes de agregar la nueva, se han implementado tanto get como set.

Esto me permitió actualizar silenciosamente los archivos nuevos leyendo la propiedad anterior, que estableció la nueva propiedad, y luego de la serialización, se agregó la nueva propiedad.

Sin embargo, me gustaría eliminar la propiedad anterior de los nuevos archivos xml, por lo que me preguntaba qué pasaría si la etiqueté con [XmlIgnore], el archivo xml antiguo aún se deserializaría correctamente y leería esa propiedad del archivo, o ¿Sería ignorado por completo?

De lo contrario, ¿los siguientes cambios harían lo que yo quería?

[XmlAttribute("is-list")] 
[DefaultValue(false)] 
public bool IsList 
{ 
    get { return false; } 
    set { 
     if (value) 
      ListHandling = ListHandling.All; 
    } 
} 

Esto return false para todos los nuevos objetos, que serían ignorados ya que he especificado un valor predeterminado, y si está presente en un archivo antiguo, y se define como true, que cambiaría la propiedad ListHandling, que es el nuevo que es importante

Editar: Al probar, he verificado que ambos enfoques parecen hacer lo que quiero. Sin embargo, dejaré la pregunta, ya que aún me gustaría saber si el primer comportamiento mencionado anteriormente es solo un detalle de la implementación, o si la documentación se puede entender de esa manera.

Respuesta

2

Si etiqueta una propiedad con XmlIgnore, es ignorado. No se considera cuando el XmlSerializer crea su ensamblado de serialización. Por lo tanto, las propiedades XmlIgnore-d no se rellenan durante la deserialización, y se quedarán con su valor predeterminado. programa

muestra (por fragmentos compilador):

public static void RunSnippet() 
{ 
    XmlSerializer ser = new XmlSerializer(typeof(Fie)); 
    Fie f = (Fie)(ser.Deserialize(new StringReader("<Fie><Bob>Hello</Bob></Fie>"))); 
    WL(f.Bob == null ? "null" : "something"); 
} 

public class Fie 
{ 
    [XmlIgnore] 
    public string Bob { get; set; } 
} 

La salida de este programa es null (y si se quita XmlIgnore de Fie.Bob la salida es something).

Editar en respuesta a tu edición: Esto no es sólo un detalle de implementación; de hecho es el comportamiento documentado del atributo.En la sección Comentarios del the docs (primer párrafo): "Si aplica XmlIgnoreAttribute a cualquier miembro de una clase, el XmlSerializer ignora al miembro al serializar o deserializar una instancia de la clase." (énfasis añadido)

+0

Ok, gracias, entonces supongo que fue una suerte tonta que mi prueba mostró lo que hizo. Supongo que mi segunda implementación es la que quiero usar en ese momento. –

+0

Si coloca el [XmlIgnore] en una propiedad subestimada/invalidada, el atributo se ignora y el valor se serializa y se deserializa. – Sven

Cuestiones relacionadas