CA2229: применяйте конструкторы сериализации

Свойство Значение
Идентификатор правила CA2229
Заголовок Реализуйте конструкторы сериализации
Категория Использование
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 No

Примечание.

Это правило было удалено в .NET 8, так как оно конфликтует с SYSLIB0051: устаревшие API-интерфейсы поддержки сериализации устарели.

Причина

Тип реализует интерфейс System.Runtime.Serialization.ISerializable, не является делегатом или интерфейсом, и одно из следующих условий истинно:

  • Тип не имеет конструктор, который принимает объекты SerializationInfo и StreamingContext (сигнатура конструктора сериализации).

  • Тип является незапечатанным, а модификатор доступа для его конструктора сериализации не защищен (семейство).

  • Тип является запечатанным, а модификатор доступа для его конструктора сериализации не является частным.

Описание правила

Это правило относится к типам, поддерживающим пользовательскую сериализацию. Тип поддерживает пользовательскую сериализацию, если реализует интерфейс ISerializable. Конструктор сериализации необходим для десериализации, или повторного создания, объектов, которые были сериализованы с помощью метода ISerializable.GetObjectData.

Устранение нарушений

Чтобы устранить нарушение этого правила, реализуйте конструктор сериализации. Для запечатанного класса конструктор должен быть закрытым, а в иных случаях — защищенным.

Когда лучше отключить предупреждения

Не следует подавлять нарушение правила. Тип не будет десериализуемым и не будет работать во многих сценариях.

Пример

В следующем примере показан тип, удовлетворяющий правилу.

[Serializable]
public class SerializationConstructorsRequired : ISerializable
{
    private int n1;

    // This is a regular constructor.
    public SerializationConstructorsRequired()
    {
        n1 = -1;
    }
    // This is the serialization constructor.
    // Satisfies rule: ImplementSerializationConstructors.

    protected SerializationConstructorsRequired(
       SerializationInfo info,
       StreamingContext context)
    {
        n1 = (info.GetValue(nameof(n1), typeof(int)) != null) ?
            (int)info.GetValue(nameof(n1), typeof(int))! :
            -1;
    }

    // The following method serializes the instance.
    void ISerializable.GetObjectData(SerializationInfo info,
       StreamingContext context)
    {
        info.AddValue(nameof(n1), n1);
    }
}

CA2237: пометьте типы ISerializable атрибутом SerializableAttribute

См. также