Sdílet prostřednictvím


XmlSerializer už ignoruje vlastnosti označené zastaralou atributem ObsoleteAttribute.

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 s IsError = false (výchozí), vlastnost je serializována normálně.
  • Pokud je atribut [Obsolete] použit s IsError = 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.

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.

Ovlivněná rozhraní API