CA2229: применяйте конструкторы сериализации
TypeName |
ImplementSerializationConstructors |
CheckId |
CA2229 |
Категория |
Microsoft.Usage |
Критическое изменение |
Не критическое |
Причина
Тип реализует интерфейс System.Runtime.Serialization.ISerializable , не является делегатом или интерфейсом и выполняется одно из следующих условий:
Тип не имеет конструктора, принимающего объект System.Runtime.Serialization.SerializationInfo и System.Runtime.Serialization.StreamingContext (подпись конструктора сериализации).
Тип незапечатан и модификатор доступа для конструктора сериализации не является защищенным (семейство).
Тип запечатан и модификатор доступа для конструктора сериализации не является закрытым.
Описание правила
Данное правило распространяется на типы, поддерживающие пользовательскую сериализацию. Чтобы поддерживать пользовательскую сериализацию, тип должен реализовывать интерфейс ISerializable. Конструктор сериализации необходим для десериализации, то есть для воссоздания объектов, которые были сериализованы методом ISerializable.GetObjectData.
Устранение нарушений
Чтобы устранить нарушение этого правила, реализуйте конструктор сериализации. Для запечатанного класса конструктор должен быть закрытым, а в иных случаях — защищенным.
Отключение предупреждений
Не следует отключать предупреждения о нарушении этого правила. Тип не будет десериализуемым и не будет работать в большинстве случаев.
Пример
В следующем примере демонстрируется тип, соответствующий правилу.
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Permissions;
namespace UsageLibrary
{
[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 = (int) info.GetValue("n1", typeof(int));
}
// The following method serializes the instance.
[SecurityPermission(SecurityAction.LinkDemand,
Flags=SecurityPermissionFlag.SerializationFormatter)]
void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.AddValue("n1", n1);
}
}
}
Связанные правила
CA2237: пометьте типы ISerializable атрибутом SerializableAttribute
См. также
Ссылки
System.Runtime.Serialization.ISerializable