Xmlignoreattribute, usato solo durante la serializzazione, non durante la deserializzazione?

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

Domanda

Ho ragione a capire il .net Xmlignoreattribute, che dice:

Incorpora il metodo serializzante di XMLSerializer per non serializzare il campo pubblico o il valore della proprietà di lettura/scrittura pubblica.

Quello:

  • La proprietà sarà deserializzata, se presente nel file XML?
  • La proprietà non sarà serializzata in un nuovo file XML?

Il motivo per cui mi chiedo è che ho sostituito una proprietà nel file con una nuova con più opzioni. La vecchia proprietà era una semplice proprietà booleana e quella nuova è un enum. Ho cambiato la vecchia proprietà in modo da convertire il valore della nuova proprietà in un valore booleano, secondo ciò che la vecchia proprietà intendeva prima di aggiungere quella nuova, sia Get and Set che è stato implementato.

Ciò mi ha permesso di aggiornare silenziosamente nuovi file leggendo la vecchia proprietà, che ha impostato la nuova proprietà e, dopo la serializzazione, è stata aggiunta la nuova proprietà.

Tuttavia, vorrei rimuovere la vecchia proprietà da nuovi file XML, quindi mi chiedevo con cosa sarebbe successo se lo taggassi [XmlIgnore], il vecchio file XML sarebbe ancora deserializzato correttamente e leggerebbe quella proprietà dal file o sarebbe completamente ignorato?

In caso contrario, il seguente cambiamento farebbe quello che voglio?

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

Ciò restituirebbe falso per tutti i nuovi oggetti, che verrebbero ignorati da quando ho specificato un valore predefinito e se presente in un vecchio file, e impostato su True, ciò cambierebbe la proprietà Listhandling, che è la nuova che è importante.

Modificare: Al test, ho verificato che entrambi gli approcci sembrano fare quello che voglio. Lascerò la domanda, poiché vorrei comunque sapere se il primo comportamento sopra indicato è solo un dettaglio di implementazione o se la documentazione può essere compresa in questo modo.

È stato utile?

Soluzione

Se tagghi una proprietà con XmlIgnore, è ignorato. Non è considerato quando XMLserializer costruisce il suo gruppo di serializzazione. Pertanto, le proprietà XMLignore-D non sono popolate durante la deserializzazione e saranno lasciate con il loro valore predefinito.

Programma di esempio (per il compilatore di frammenti):

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

L'output di questo programma è null (E se rimuovi xmlignore da fie.bob l'output è something).

Modifica in risposta alla tua modifica: Questo non è solo un dettaglio di implementazione; È davvero il comportamento documentato dell'attributo. Dalla sezione delle osservazioni di i documenti (primo paragrafo): "Se si applica XmLignoreAttribute a qualsiasi membro di una classe, l'XMLserializer ignora il membro durante la serializzazione o deserializzazione un'istanza della classe "(enfasi aggiunta)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top