CA2229: применяйте конструкторы сериализации
Свойство | Значение |
---|---|
Идентификатор правила | CA2229 |
Заголовок | Реализуйте конструкторы сериализации |
Категория | Использование |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | 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