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


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

System.Runtime.Serialization.SerializationInfo

System.Runtime.Serialization.StreamingContext