Почему хэш-таблица HashMap отмечена как переходная, хотя класс сериализуем
Я смотрел на источник HashMap.
A HashMap
implements Serializable
.
Хорошо, это так, что его можно перевести/передать как объект.
Но я вижу, что сама хэш-таблица отмечена как transient
.
Я не понимаю этого. Если вы отмечаете его как временный, не означает ли это, что он должен не сериализоваться?
Но все данные находятся в таблице. Так почему это transient
?
Возможно, я смущен тем, как работает Serializable
?
Ответы
Ответ 1
HashMap
использует writeObject
и readObject
для реализации пользовательской сериализации, а не просто для того, чтобы его поле было сериализовано в обычном режиме. Он записывает количество ведер, общий размер и каждую запись в поток и перестраивается из этих полей при десериализации. Как говорит tzaman, сама таблица не нужна в серийной форме, поэтому она не сериализована для экономии места.
Вы можете узнать больше об этих методах и некоторых других методах выполнения пользовательской сериализации (writeReplace
и readResolve
) в Serializable javadoc.
Ответ 2
Ключевое слово transient
указывает, что поле не должно включаться в сериализованное представление класса. Таблица Entry[]
HashMap
- это просто структура ускорения - она позволяет быстро находить сохраненные записи.
Сама вся таблица не обязательно должна быть сериализована, только содержащиеся в ней записи, так как таблица может быть перестроена снова при десериализации из списка записей.