Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Od verze .NET 10 se chování XmlSerializer změnilo s ohledem na to, jak zpracovává vlastnosti označené atributem ObsoleteAttribute . Dříve byly vlastnosti označené [Obsolete] považovány za označené i [XmlIgnore], což způsobilo, že byly vyloučeny z serializace XML. Toto chování bylo nezamýšlené a bylo opraveno.
Při této změně jsou vlastnosti označené [Obsolete] nyní serializovány ve výchozím nastavení, pokud není vlastnost nastavena IsError na true. Pokud IsError je true, serializátor vyvolá InvalidOperationException během vytváření. Kromě toho byl zaveden přepínač AppContext, Switch.System.Xml.IgnoreObsoleteMembersaby se vývojáři v případě potřeby mohli vrátit k předchozímu chování.
Verze byla představena
.NET 10
Předchozí chování
V předchozích verzích rozhraní .NET byly vlastnosti označené atributem [Obsolete] vyloučeny z serializace XML, podobně jako vlastnosti označené .[XmlIgnore] Toto chování bylo neočekávané a nebylo v souladu s zamýšleným účelem atributu [Obsolete] , což je poskytnout upozornění na dobu kompilace o zastaralých rozhraních API.
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());
Výstup před změnou:
<Example>
<NormalProperty>normal</NormalProperty>
</Example>
Nové chování
Počínaje verzí .NET 10 nejsou vlastnosti označené [Obsolete] ve výchozím nastavení vyloučeny ze serializace XML. Namísto:
-
[Obsolete]Pokud je atribut použit sIsError = false(výchozí), vlastnost je serializována normálně. - Pokud je atribut
[Obsolete]použit sIsError = true, XmlSerializer vyvolá InvalidOperationException při vytváření serializátoru.
Pomocí stejného kódu, jak je znázorněno v části o předchozím chování, je výstup po změně:
<Example>
<NormalProperty>normal</NormalProperty>
<ObsoleteProperty>obsolete</ObsoleteProperty>
</Example>
Pokud je [Obsolete(IsError = true)] použit na vlastnost, je vyvolána následující výjimka během vytváření serializátoru.
System.InvalidOperationException: Nelze serializovat člen 'ObsoleteProperty', protože je označeno pomocí ObsoleteAttribute a IsError je nastavena na hodnotu true.
Poznámka:
Vlastnosti, které jsou označeny jako [Obsolete], byly vždy úspěšně deserializovány, když jsou data přítomna v XML. I když tato změna umožňuje, aby [Obsolete] vlastnosti mohly projít "round trip" z objektu do XML a zpět do objektu, nové chování ovlivňuje pouze část "round tripu" týkající se serializace (objekt do XML).
Typ zásadní změny
Tato změna je změna chování.
Důvod změny
Předchozí chování, kdy bylo s [Obsolete] zacházeno jako s ekvivalentem [XmlIgnore], bylo nezamýšlené a neslučitelné s účelem atributu [Obsolete]. Tato změna zajišťuje, že [Obsolete] se používá výhradně pro zamýšlený účel poskytování upozornění v době kompilace a nemá vliv na chování serializace modulu runtime. Zavedení přepínače AppContext umožňuje vývojářům v případě potřeby vyjádřit výslovný souhlas se starším chováním.
Doporučená akce
Zkontrolujte základ kódu a zkontrolujte veškeré spoléhání na předchozí chování, kdy [Obsolete] byly vlastnosti vyloučeny ze serializace XML. Pokud je toto chování stále žádoucí, povolte přepínač Switch.System.Xml.IgnoreObsoleteMembers AppContext následujícím způsobem:
AppContext.SetSwitch("Switch.System.Xml.IgnoreObsoleteMembers", true);
Pokud jsou některé vlastnosti označené [Obsolete(IsError = true)] a jsou serializovány, aktualizujte kód tak, aby buď atribut [Obsolete] odebral, nebo nastavte IsError = false, aby se předešlo výjimkám za běhu.