Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Начиная с .NET 10 поведение XmlSerializer изменилось в отношении того, как он обрабатывает свойства, помеченные атрибутом ObsoleteAttribute . Ранее свойства, помеченные как [Obsolete], считались также помеченными как [XmlIgnore], что приводило к их исключению из сериализации XML. Это поведение было непреднамерено и было исправлено.
При этом изменении свойства, помеченные как [Obsolete], теперь сериализуются по умолчанию, если свойство IsError задано как true. Если IsError является true, сериализатор выбрасывает исключение InvalidOperationException во время создания сериализатора. Кроме того, был введен параметр AppContext, Switch.System.Xml.IgnoreObsoleteMembersпозволяющий разработчикам вернуться к предыдущему поведению при необходимости.
Представленная версия
.NET 10
Предыдущее поведение
В предыдущих версиях .NET свойства, помеченные [Obsolete] атрибутом, были исключены из сериализации XML, аналогично свойствам, помеченным как [XmlIgnore]. Это поведение было непредвиденное и не соответствует целевой цели атрибута [Obsolete] , которое заключается в предоставлении предупреждений во время компиляции о устаревших 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());
Выходные данные перед изменением:
<Example>
<NormalProperty>normal</NormalProperty>
</Example>
Новое поведение
Начиная с .NET 10 свойства, помеченные как [Obsolete] не исключены из сериализации XML по умолчанию. Вместо:
-
[Obsolete]Если атрибут применяется сIsError = false(по умолчанию), свойство сериализуется обычно. - Если атрибут
[Obsolete]применяется сIsError = true, во время создания сериализатора XmlSerializer выдает InvalidOperationException исключение.
Используя тот же код, что и в предыдущем разделе поведения, выходные данные после изменения:
<Example>
<NormalProperty>normal</NormalProperty>
<ObsoleteProperty>obsolete</ObsoleteProperty>
</Example>
Если [Obsolete(IsError = true)] применяется к свойству, во время создания сериализатора возникает следующее исключение:
System.InvalidOperationException: не удается сериализовать член 'ObsoleteProperty', так как он помечен как 'ObsoleteAttribute' и IsError имеет значение true.
Замечание
Свойства, помеченные как [Obsolete] всегда успешно десериализированные при наличии данных в XML. Новое поведение влияет только на часть сериализации (объект к XML) в "обратимом процессе", хотя это изменение позволяет свойствам [Obsolete] участвовать в "обратимом процессе" от объекта к XML и обратно к объекту.
Тип разрушающего изменения
Это изменение поведения.
Причина изменения
Предыдущее поведение обработки [Obsolete] как эквивалентной [XmlIgnore] было непреднамеренным и несогласованным с целью атрибута [Obsolete]. Это изменение гарантирует, что [Obsolete] используется исключительно для своей цели предоставления предупреждений на этапе компиляции и не влияет на поведение сериализации во время выполнения. Введение параметра AppContext позволяет разработчикам при необходимости выбрать устаревшее поведение.
Рекомендуемое действие
Просмотрите кодовую базу на предмет зависимости от предыдущего поведения, при котором [Obsolete] свойства исключались из сериализации XML. Если это поведение по-прежнему необходимо, включите переключатель Switch.System.Xml.IgnoreObsoleteMembers AppContext следующим образом:
AppContext.SetSwitch("Switch.System.Xml.IgnoreObsoleteMembers", true);
Если все свойства помечены [Obsolete(IsError = true)] и сериализуются, обновите код, чтобы удалить [Obsolete] атрибут или установить IsError = false , чтобы избежать исключений среды выполнения.