XmlignoreAttribute, solo usado durante la serialización, no durante la deserialización?

StackOverflow https://stackoverflow.com/questions/2350453

Pregunta

¿Tengo razón al comprender el .net? XmlignoreAttribute, que dice:

Instruye el método de serializar del XMLSerializer para no serializar el campo público o el valor de la propiedad de lectura pública/escritura.

que:

  • ¿La propiedad estará deserializada, si está presente en el archivo XML?
  • ¿La propiedad no se serializa a un nuevo archivo XML?

La razón por la que pregunto es que he reemplazado una propiedad en el archivo con uno nuevo con más opciones. La antigua propiedad era una simple propiedad booleana, y la nueva es un enum. He cambiado la propiedad anterior para que convierta el valor de la nueva propiedad en un valor booleano, de acuerdo con lo que la propiedad anterior significaba antes de agregar la nueva, se ha implementado tanto Get como Set.

Esto me permitió actualizar en silencio nuevos archivos leyendo la propiedad anterior, que establece la nueva propiedad, y tras 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 etiquetara con [XmlIgnore], ¿El archivo XML antiguo aún se deserializaría correctamente y leería esa propiedad del archivo, o se ignoraría por completo?

Si no, ¿el siguiente cambio haría lo que quiero?

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

Esto devolvería falso para todos los objetos nuevos, que se ignorarían ya que he especificado un valor predeterminado, y si está presente en un archivo anterior, y establecido en True, eso cambiaría la propiedad de listón, que es la nueva que es importante.

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

¿Fue útil?

Solución

Si etiqueta una propiedad con XmlIgnore, es ignorado. No se considera cuando el XMLSerializer construye su conjunto de serialización. Por lo tanto, las propiedades de XMLignore-D no están pobladas durante la deserialización, y se dejarán con su valor predeterminado.

Programa de muestra (para compilador de fragmento):

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 elimina xmlignore de fie.bob, la salida es something).

Editar en respuesta a su edición: Esto no es solo un detalle de implementación; De hecho, es el comportamiento documentado del atributo. De la sección de comentarios de los documentos (Primer párrafo): "Si aplica el XMLignoreAtTribute a cualquier miembro de una clase, el XMLSerializer ignora al miembro al serializar o deserializar una instancia de la clase "(énfasis agregado)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top