Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ab .NET 10 hat sich das Verhalten XmlSerializer in Bezug auf die Behandlung von Eigenschaften geändert, die mit dem ObsoleteAttribute Attribut gekennzeichnet sind. Zuvor wurden mit markierten [Obsolete] Eigenschaften behandelt, als wären sie auch mit [XmlIgnore]gekennzeichnet, was dazu führte, dass sie von der XML-Serialisierung ausgeschlossen werden. Dieses Verhalten war unbeabsichtigt und wurde korrigiert.
Bei dieser Änderung werden Eigenschaften, die mit [Obsolete] gekennzeichnet sind, standardmäßig serialisiert, es sei denn, die IsError-Eigenschaft ist auf true gesetzt. Wenn IsErrortrue ist, löst der Serialisierer während der Erstellung einen InvalidOperationException aus. Darüber hinaus wurde ein AppContext-Switch eingeführt, Switch.System.Xml.IgnoreObsoleteMembersdamit Entwickler bei Bedarf auf das vorherige Verhalten zurücksetzen können.
Eingeführt in Version
.NET 10
Vorheriges Verhalten
In früheren Versionen von .NET wurden eigenschaften, die mit dem Attribut gekennzeichnet sind, von der [Obsolete] XML-Serialisierung ausgeschlossen, ähnlich wie eigenschaften, die mit [XmlIgnore]gekennzeichnet sind. Dieses Verhalten war unerwartet und nicht an den beabsichtigten Zweck des [Obsolete] Attributs ausgerichtet, das Kompilierungszeitwarnungen zu veralteten APIs bereitstellt.
public class Example
{
public string NormalProperty { get; set; } = "normal";
[Obsolete("This property is deprecated")]
public string ObsoleteProperty { get; set; } = "obsolete";
[XmlIgnore]
public string IgnoredProperty { get; set; } = "ignored";
}
var obj = new Example();
var serializer = new XmlSerializer(typeof(Example));
using var writer = new StringWriter();
serializer.Serialize(writer, obj);
Console.WriteLine(writer.ToString());
Ausgabe vor der Änderung:
<Example>
<NormalProperty>normal</NormalProperty>
</Example>
Neues Verhalten
Ab .NET 10 werden Eigenschaften, die mit [Obsolete] gekennzeichnet sind, standardmäßig nicht mehr bei der XML-Serialisierung ausgeschlossen. Stattdessen:
- Wenn das
[Obsolete]Attribut mitIsError = false(Standard) angewendet wird, wird die Eigenschaft normal serialisiert. - Wenn das
[Obsolete]Attribut mitIsError = trueangewendet wird, löst dies eine XmlSerializer während der InvalidOperationException Serialisierungserstellung aus.
Verwenden Sie den gleichen Code wie im vorherigen Verhaltensabschnitt gezeigt, und die Ausgabe nach der Änderung lautet:
<Example>
<NormalProperty>normal</NormalProperty>
<ObsoleteProperty>obsolete</ObsoleteProperty>
</Example>
Wenn [Obsolete(IsError = true)] auf eine Eigenschaft angewendet wird, wird die folgende Ausnahme während der Erstellung des Serialisierers ausgelöst:
System.InvalidOperationException: Member 'ObsoleteProperty' kann nicht serialisiert werden, da es mit ObsoleteAttribute gekennzeichnet ist und IsError auf "true" festgelegt ist.
Hinweis
Eigenschaften, die als [Obsolete] gekennzeichnet sind, wurden immer erfolgreich deserialisiert, wenn Daten im XML vorhanden sind. Diese Änderung ermöglicht es [Obsolete]-Eigenschaften zwar, vom Objekt in XML und wieder zurück zum Ursprungsobjekt einen "Round-trip" zu machen, aber das neue Verhalten wirkt sich nur auf die Serialisierungshälfte (Objekt zu XML) dieses neuen Verhaltens aus.
Art der einschneidenden Änderung
Diese Änderung ist eine Verhaltensänderung.
Grund für Änderung
Das vorherige Verhalten, [Obsolete] als gleichwertig zu [XmlIgnore] zu behandeln, war unbeabsichtigt und stand im Widerspruch zum Zweck des [Obsolete]-Attributs. Diese Änderung stellt sicher, dass [Obsolete] ausschließlich für den beabsichtigten Zweck, Kompilierungszeitwarnungen bereitzustellen, verwendet wird und sich nicht auf das Verhalten der Laufzeitserialisierung auswirkt. Durch die Einführung des AppContext-Switches können Entwickler bei Bedarf das Legacyverhalten aktivieren.
Empfohlene Aktion
Überprüfen Sie Ihre Codebasis auf Abhängigkeiten vom vorherigen Verhalten, bei welchem [Obsolete] Eigenschaften von der XML-Serialisierung ausgeschlossen wurden. Wenn dieses Verhalten weiterhin gewünscht ist, aktivieren Sie die Option Switch.System.Xml.IgnoreObsoleteMembers "AppContext" wie folgt:
AppContext.SetSwitch("Switch.System.Xml.IgnoreObsoleteMembers", true);
Wenn Eigenschaften mit [Obsolete(IsError = true)] gekennzeichnet sind und serialisiert werden, aktualisieren Sie den Code, um entweder das [Obsolete]-Attribut zu entfernen oder IsError = false festzulegen, um Laufzeit-Ausnahmen zu vermeiden.