Почему хэш-таблица HashMap помечена как временная, хотя класс является сериализуемым - PullRequest
24 голосов
/ 05 февраля 2012

Я искал источник HashMap .

A HashMap implements Serializable.

Хорошо, это так, что его можно прослушивать / передавать как объект.

Но я вижу, что сама хеш-таблица помечена как transient.

Я не понимаю. Если вы пометили его как временный, разве это не значит, что он должен не быть сериализованным?

Но все данные в таблице. Так почему же это transient?

Возможно, я не совсем понимаю, как работает Serializable?

Ответы [ 2 ]

33 голосов
/ 05 февраля 2012

HashMap использует writeObject и readObject для реализации пользовательской сериализации, а не просто для обычного сериализации своего поля.Он записывает количество сегментов, общий размер и каждую из записей в поток и восстанавливает себя из этих полей после десериализации.Как говорит Цаман, сама таблица не нужна в последовательной форме, поэтому она не сериализуется для экономии места.

Вы можете прочитать больше об этих методах и некоторых других методах пользовательской сериализации (writeReplace и readResolve) в Сериализуемый Javadoc.

13 голосов
/ 05 февраля 2012

Ключевое слово transient указывает, что поле не должно быть включено в сериализованное представление класса.Таблица Entry[] для HashMap - это просто структура ускорения - она ​​позволяет быстро искать сохраненные записи.Вся таблица сама по себе не нуждается в сериализации, только записи, которые она содержит, поскольку таблица может быть заново построена при десериализации из списка записей.

...