﻿# V3103\. A private Ctor\(SerializationInfo, StreamingContext\) constructor in unsealed type will not be accessible when deserializing derived types\.

Анализатор обнаружил странный модификатор доступа у конструктора сериализации\.

Странными можно считать следующие ситуации:

* модификатор доступа – public;
* тип не запечатан \(unsealed type\), при этом его модификатор доступа – private\.

Конструктор сериализации вызывается при десериализации объекта и не должен вызываться извне типа \(исключение – вызов конструктора классом\-наследником\), поэтому не стоит объявлять его с модификатором 'public' или 'internal'\.

Если конструктор объявлен с модификатором 'private', но класс не является запечатанным, классы\-наследники не смогут вызывать этот конструктор, что приведёт к невозможности десериализации членов базового типа\.

Рассмотрим пример:

```cpp
[Serializable]
class C1 : ISerializable
{
  ....
  private C1(SerializationInfo info, StreamingContext context)
  {
    ....
  }
  ....
}
```

Класс 'C1' является незапечатанным, но при этом конструктор сериализации объявлен с модификатором доступа 'private', что приведёт к невозможности вызова этого конструктора из дочерних классов и, как следствие, к неверной десериализации объекта\. Для исправления ситуации необходимо исправить модификатор доступа на 'protected':

```cpp
[Serializable]
class C1 : ISerializable
{
  ....
  protected C1(SerializationInfo info, StreamingContext context)
  {
    ....
  }
  ....
}
```

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

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

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

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