XmlignoreeTtribute, nur während der Serialisierung verwendet, nicht während der Deserialisierung?

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

Frage

Habe ich Recht, das .NET zu verstehen XmlignoreeTtribute, was sagt:

Weisen Sie die Serialize -Methode des XMLSerializer an, das öffentliche Feld oder den Wert der öffentlichen Lesen/Schreiben nicht zu serialisieren.

das:

  • Die Eigenschaft wird deserialisiert, wenn sie in der XML -Datei vorhanden ist?
  • Die Eigenschaft wird nicht in eine neue XML -Datei serialisiert?

Der Grund, warum ich frage, ist, dass ich eine Eigenschaft in der Datei durch eine neue mit weiteren Optionen ersetzt habe. Das alte Grundstück war ein einfaches boolescher Eigentum, und das neue ist eine Aufzählung. Ich habe die alte Eigenschaft so geändert, dass es den Wert der neuen Eigenschaft in einen booleschen Wert umwandelt. Laut dem, was die alte Eigenschaft vor dem Hinzufügen des neuen, wurde beide Get und Set implementiert.

Dies ermöglichte es mir, neue Dateien durch das Lesen der alten Eigenschaft, die die neue Eigenschaft festlegte, stillschweigend zu aktualisieren, und bei der Serialisierung wurde die neue Eigenschaft hinzugefügt.

Ich möchte jedoch die alte Eigenschaft aus neuen XML -Dateien entfernen, also fragte ich [XmlIgnore], Würde die alte XML -Datei noch ordnungsgemäß deserialisieren und diese Eigenschaft aus der Datei lesen, oder würde sie vollständig ignoriert?

Wenn nicht, würde die folgende Änderung das tun, was ich will?

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

Dies würde für alle neuen Objekte falsch zurückgeführt, die ignoriert werden, da ich einen Standardwert angegeben habe und wenn ich in einer alten Datei vorhanden und auf True eingestellt bin, würde das die Listhandling -Eigenschaft, die das neue ist, das wichtig ist.

Bearbeiten: Beim Testen habe ich überprüft, ob beide Ansätze zu tun scheinen, was ich will. Ich werde die Frage jedoch hinterlassen, da ich immer noch wissen möchte, ob das erste oben angegebene Verhalten nur ein Implementierungsdetail ist oder ob die Dokumentation so verstanden werden kann.

War es hilfreich?

Lösung

Wenn Sie eine Immobilie mit dem Marketing machen XmlIgnore, es ist ignoriert. Es wird nicht berücksichtigt, wenn der XMLSerializer seine Serialisierungsanordnung aufbaut. Daher werden XMLignore-D-Eigenschaften während der Deserialisierung nicht besiedelt und werden mit ihrem Standardwert belassen.

Beispielprogramm (für Snippet Compiler):

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

Die Ausgabe dieses Programms ist null (Und wenn Sie XMLignore von fie.bob entfernen, ist die Ausgabe something).

Bearbeiten Sie als Antwort auf Ihre Bearbeitung: Dies ist nicht nur ein Implementierungsdetail. Es ist in der Tat das dokumentierte Verhalten des Attributs. Aus dem Abschnitt der Bemerkungen von Die Dokumente (Erster Absatz): "Wenn Sie das XMLignoreArttribute auf ein Mitglied einer Klasse anwenden, ignoriert der XMLSerializer das Mitglied beim Serialisieren oder Deserialisierung eine Instanz der Klasse. "(Hervorhebung hinzugefügt)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top