Разумно ли использовать хеш-код класса в качестве его serialVersionUID? - PullRequest
2 голосов
/ 13 мая 2019

Я заметил, что в кодовой базе моей компании распространенным шаблоном является установка serialVersionUID класса в хеш-код класса, например:

public final class ClassName implements Serializable {

    private static final long serialVersionUID = ClassName.class.hashCode();

    [...]

}

Это правильный подход для установки класса 'serialVersionUID?

Ответы [ 2 ]

6 голосов
/ 13 мая 2019

Class не имеет явно определенного метода hashCode(), поэтому он не определен как стабильный.

Это означает, что вы можете (и, вероятно, будете) получать разные результаты для MyClass.class.hashCode() между различными запусками, даже на одной и той же JVM и определенно между различными реализациями и / или версиями JVM.

Это означает, что сериализованные данные из любой одной JVM, вероятно, будут использоваться только в пределахта же JVM.

Теперь, когда может использоваться в качестве преднамеренного способа избежать использования сериализации для связи между виртуальными машинами (это не «механизм безопасности» или что-то в этом роде, ноего можно использовать для быстрого обнаружения попыток использовать сериализацию для связи между виртуальными машинами).Но если это и есть цель, то лучше использовать случайное число, вероятно, лучше.

3 голосов
/ 13 мая 2019

Это ужасная идея.Существует несколько стратегий вычисления hashCode (Class::hashCode равно Object::hashCode).В java-8 по умолчанию используется Marsaglia-XOR-Shift, псевдослучайный генератор, который даст вам int;но это может быть изменено с ВМ на ВМ, и есть несколько способов изменить это и из той же версии, см. этот ответ для получения подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...