Uid серийной версии в абстрактном классе исключений

У меня есть базовый пользовательский класс исключений BaseException

public class BaseException extends RuntimeException {

}

и несколько пользовательских исключений, расширяющих BaseException

public class CustomException extends BaseException {
 private static final long serialVersionUID = 3655655808021733968L;
}

Я получил предупреждение о том, что uid серийной версии не объявлен в классе BaseException. Нужно ли это в абстрактном классе? Это хорошая практика? Есть ли способ избавиться от предупреждения?


person Juan    schedule 29.04.2020    source источник


Ответы (1)


Да, вам нужно определить serialVersionUID в абстрактном классе. Сериализация сериализует состояние экземпляра, что обычно означает нестатические поля; любое унаследованное состояние должно быть сериализовано вместе с остальным состоянием объекта.

Тот факт, что у вас нет полей в BaseException, не означает, что вы должны пропустить serialVersionUID.

Обратите внимание, что, вопреки распространенному мнению, serialVersionUID не обязательно должен основываться на хэше имени или структуры класса. Это делает только вычисленный по умолчанию UID серийной версии, если класс не определяет поле serialVersionUID явно. Обычно вы можете объявить его как простое число:

private static final long serialVersionUID = 1;
person VGR    schedule 29.04.2020