﻿# V6075\. The signature of method 'X' does not conform to serialization requirements\.

Анализатор обнаружил пользовательский метод сериализации, который не соответствует требованиям интерфейса\. В случае несоответствия пользовательская сериализация будет проигнорирована средствами Serialization API\.

Если поведения сериализации по умолчанию для пользовательского класса недостаточно, то есть возможность его изменить, реализовав специальные методы:

```cpp
private void writeObject(java.io.ObjectOutputStream out)
   throws IOException
private void readObject(java.io.ObjectInputStream in)
   throws IOException, ClassNotFoundException;
private void readObjectNoData()
   throws ObjectStreamException;
ANY-ACCESS-MODIFIER Object writeReplace()
   throws ObjectStreamException;
ANY-ACCESS-MODIFIER Object readResolve()
   throws ObjectStreamException;
```

Однако реализовывать эти методы необходимо строго по тем требованиям, которые формируются из сигнатур вышеуказанных методов\. Если этого не сделать, то пользовательская реализация сериализации будет проигнорирована в пользу сериализации по умолчанию\.  Дополнительно можно почитать [здесь](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/Serializable.html)\.

Сложность заключается в том, что интерфейс 'java\.io\.Serializable' представляет собой пустой интерфейс и является лишь маркером для механизма сериализации\. И в случае реализации своей логики, неправильно определенные методы не обнаруживаются при помощи, например, компилятора, так как они представляют собой обычные пользовательские методы\.

Рассмотрим синтетический пример, который вполне имеет право на существование в реальном проекте:

```cpp
class Base implements Serializable
{
  ....
}

class Example extends Base
{
  ....
  void writeObject(java.io.ObjectOutputStream out)
       throws IOException
  {
    throw new NotSerializableException("Serialization is not supported!");
  }

  void readObject(java.io.ObjectInputStream in) 
       throws IOException, ClassNotFoundException
  {
    throw new NotSerializableException("Deserialization is not supported!");
  }
}
```

Был базовый класс, который мог участвовать в сериализации\. Со временем понадобилось создать дочерний класс, но сериализация была не нужна\. Программист реализовал соответствующие методы\-заглушки и продолжил писать код дальше\. Через какое\-то время обнаруживается, что наш дочерний класс, вопреки желанию автора кода, сериализуется\! Это произошло именно из\-за того, что реализованные методы не соответствуют требованиям\. Для исправления ситуации необходимо default модификатор изменить на private:

```cpp
class Base implements Serializable
{
  ....
}

class Example extends Base
{
  ....
  private void writeObject(java.io.ObjectOutputStream out)
       throws IOException
  {
    throw new NotSerializableException("Serialization is not supported!");
  }

  private void readObject(java.io.ObjectInputStream in) 
       throws IOException, ClassNotFoundException
  {
    throw new NotSerializableException("Deserialization is not supported!");
  }
  ....
}
```