CA2237: пометьте типы ISerializable атрибутом SerializableAttribute
Свойство | Значение |
---|---|
Идентификатор правила | CA2237 |
Заголовок | Пометьте типы ISerializable атрибутом SerializableAttribute |
Категория | Использование |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | No |
Причина
Тип, видимый извне, реализует интерфейс System.Runtime.Serialization.ISerializable, и этот тип не помечен атрибутом System.SerializableAttribute. Это правило игнорирует производные типы, базовый тип которых не является сериализуемым.
Описание правила
Чтобы среда CLR распознавала тип как сериализуемый, он должен быть помечен атрибутом SerializableAttribute, даже если тип использует пользовательскую процедуру сериализации посредством реализации интерфейса ISerializable.
Устранение нарушений
Чтобы устранить нарушение этого правила, примените атрибут SerializableAttribute к типу.
Когда лучше отключить предупреждения
Не подавляйте предупреждение из этого правила для классов исключений, так как они должны быть сериализуемыми для правильной работы между доменами приложений.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA2237
// The code that's violating the rule is on this line.
#pragma warning restore CA2237
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA2237.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Пример
В следующем примере показан тип, нарушающий это правило. Раскомментируйте строку атрибута SerializableAttribute для соответствия правилу.
Imports System.Runtime.Serialization
Namespace ca2237
' <SerializableAttribute> _
Public Class BaseType
Implements ISerializable
Dim baseValue As Integer
Sub New()
baseValue = 3
End Sub
Protected Sub New(
info As SerializationInfo, context As StreamingContext)
baseValue = info.GetInt32("baseValue")
End Sub
Overridable Sub GetObjectData(
info As SerializationInfo, context As StreamingContext) Implements ISerializable.GetObjectData
info.AddValue("baseValue", baseValue)
End Sub
End Class
End Namespace
// [SerializableAttribute]
public class BaseType : ISerializable
{
int baseValue;
public BaseType()
{
baseValue = 3;
}
protected BaseType(
SerializationInfo info, StreamingContext context)
{
baseValue = info.GetInt32("baseValue");
}
public virtual void GetObjectData(
SerializationInfo info, StreamingContext context)
{
info.AddValue("baseValue", baseValue);
}
}