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

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

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

    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;

Однако реализовывать эти методы необходимо строго по тем требованиям, которые формируются из сигнатур вышеуказанных методов. Если этого не сделать, то пользовательская реализация сериализации будет проигнорирована в пользу сериализации по умолчанию. Дополнительно можно почитать здесь.

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

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

    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:

    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!");
      }
      ....
    }

Данная диагностика классифицируется как:

CWE-684 CERT-SER01-J