Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A partir do .NET 10, o comportamento do XmlSerializer foi alterado em relação à forma como ele manipula as propriedades marcadas com o ObsoleteAttribute atributo. Anteriormente, as propriedades marcadas com [Obsolete] eram tratadas como se também estivessem marcadas com [XmlIgnore], fazendo com que fossem excluídas da serialização XML. Este comportamento não foi intencional e foi corrigido.
Com essa alteração, as propriedades marcadas com [Obsolete] agora são serializadas por padrão, a menos que a IsError propriedade esteja definida como true. Se IsError é true, o serializador lança um InvalidOperationException durante a criação. Além disso, uma opção AppContext, Switch.System.Xml.IgnoreObsoleteMembers, foi introduzida para permitir que os desenvolvedores revertam para o comportamento anterior, se necessário.
Versão introduzida
.NET 10
Comportamento anterior
Em versões anteriores do .NET, as propriedades marcadas com o [Obsolete] atributo eram excluídas da serialização XML, semelhante às propriedades marcadas com [XmlIgnore]. Esse comportamento foi inesperado e não alinhado com a finalidade pretendida [Obsolete] do atributo, que é fornecer avisos em tempo de compilação sobre APIs preteridas.
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());
Saída antes da alteração:
<Example>
<NormalProperty>normal</NormalProperty>
</Example>
Novo comportamento
A partir do .NET 10, as propriedades marcadas com [Obsolete] não são mais excluídas da serialização XML por padrão. Em vez disso:
- Se o
[Obsolete]atributo for aplicado comIsError = false(padrão), a propriedade será serializada normalmente. - Se o
[Obsolete]atributo for aplicado comIsError = true, o XmlSerializer lançará um InvalidOperationException durante a criação do serializador.
Usando o mesmo código mostrado na seção de comportamento anterior, a saída após a alteração é:
<Example>
<NormalProperty>normal</NormalProperty>
<ObsoleteProperty>obsolete</ObsoleteProperty>
</Example>
Se [Obsolete(IsError = true)] for aplicada a uma propriedade, a seguinte exceção será lançada durante a criação do serializador:
System.InvalidOperationException: Não é possível serializar o membro 'ObsoleteProperty' porque está marcado com ObsoleteAttribute e IsError está definido como true.
Observação
Propriedades que são marcadas como [Obsolete] têm sido sempre desserializadas com êxito quando os dados estão presentes no XML. Embora esta alteração permita que [Obsolete] as propriedades façam um "round trip" ou "ciclo completo" de objeto para XML e de volta para objeto, o novo comportamento afeta apenas a parte de serialização (objeto para XML) do "round trip" ou "ciclo completo".
Tipo de mudança disruptiva
Esta alteração é de natureza comportamental .
Motivo da mudança
O comportamento anterior de tratar [Obsolete] como equivalente a [XmlIgnore] foi não intencional e inconsistente com a finalidade do [Obsolete] atributo. Essa alteração garante que [Obsolete] é usada exclusivamente para a finalidade pretendida de fornecer avisos em tempo de compilação e não afeta o comportamento de serialização em tempo de execução. A introdução da opção AppContext permite que os desenvolvedores aceitem o comportamento herdado, se necessário.
Ação recomendada
Analise a sua base de código para verificar se há dependência do comportamento anterior, em que as propriedades [Obsolete] foram excluídas da serialização XML. Se esse comportamento ainda for desejado, habilite a opção Switch.System.Xml.IgnoreObsoleteMembers AppContext da seguinte maneira:
AppContext.SetSwitch("Switch.System.Xml.IgnoreObsoleteMembers", true);
Se alguma propriedade estiver marcada com [Obsolete(IsError = true)] e sendo serializada, atualize o código para remover o [Obsolete] atributo ou definir IsError = false para evitar exceções de tempo de execução.