Прочитать на английском

Поделиться через


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 для соответствия правилу.

// [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);
    }
}