# V3094. Possible exception when deserializing type. The Ctor(SerializationInfo, StreamingContext) constructor is missing.

Анализатор обнаружил подозрительный класс, реализующий интерфейс 'ISerializable', но не реализующий конструктор сериализации.

Конструктор сериализации применяется при десериализации объекта и принимает 2 параметра, имеющих типы 'SerializationInfo' и 'StreamingContext'. Наследование от данного интерфейса обязует программиста реализовать метод 'GetObjectData', но не обязует реализовывать конструктор сериализации. Однако его отсутствие приведёт к возникновению исключения типа 'SerializationException'.

Рассмотрим пример ошибочного кода. Пусть где-то определен метод, выполняющий сериализацию и десериализацию объекта:

    static void Foo(MemoryStream ms, BinaryFormatter bf, C1 obj)
    {
      bf.Serialize(ms, obj);
      ms.Position = 0;
      obj = (C1)bf.Deserialize(ms);
    }

А сам класс 'C1' определён следующим образом:

    [Serializable]
    sealed class C1 : ISerializable
    {
      public C1()
      { }

      public void GetObjectData(SerializationInfo info,
                                StreamingContext context)
      {
        info.AddValue("field", field, typeof(String));
      }

      private String field;
    }

При попытке десериализовать объект будет сгенерировано исключение типа 'SerializationException'. Для того, чтобы объект типа 'C1' корректно проходил десериализацию, необходимо реализовать специальный конструктор. Тогда исправленное объявление класса будет выглядеть так:

    [Serializable]
    sealed class C1 : ISerializable
    {
      public C1()
      { }

      private C1(SerializationInfo info, StreamingContext context)
      {
        field = (String)info.GetValue("field", typeof(String));
      }

      public void GetObjectData(SerializationInfo info,
                                StreamingContext context)
      {
        info.AddValue("field", field, typeof(String));
      }

      private String field;
    }

Примечание. Для данной диагностики доступна дополнительная настройка, задающаяся в конфигурационном файле (*.pvsconfig), имеющая следующий синтаксис:

    //+V3094:CONF:{ IncludeBaseTypes: true }

В таком случае анализатор просматривает не только непосредственно реализацию интерфейса 'ISerializable' самим классом, но и каким-либо из базовых. По умолчанию эта настройка отключена.

Дополнительную информацию о конфигурационных файлах можно прочитать здесь.