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

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

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

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

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

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

```cpp
[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' корректно проходил десериализацию, необходимо реализовать специальный конструктор\. Тогда исправленное объявление класса будет выглядеть так:

```cpp
[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\), имеющая следующий синтаксис:

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

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

Дополнительную информацию о конфигурационных файлах можно прочитать [здесь](https://pvs-studio.ru/ru/docs/manual/0017/)\.