Почему атрибут таблицы Hashtable сериализован? - PullRequest
3 голосов
/ 26 марта 2010

Почему поле table сериализовано Hashtable, хотя оно помечено как transient?

Ответы [ 3 ]

7 голосов
/ 26 марта 2010

Он помечен как временный, потому что небезопасно использовать схему сериализации по умолчанию в массиве Entry. Скорее, когда Hashtable десериализуется, ключи в таблице должны быть перефразированы и записи должны быть добавлены в слоты в соответствии с новыми значениями хэш-кода. Это необходимо, потому что ключи могут иметь разные хэш-коды после десериализации ... по разным причинам. Эта работа будет выполнена методом Hashtable readObject().

1 голос
/ 26 марта 2010

Если вы посмотрите на исходный код класса Hashtable (по крайней мере, в 1.6), Entry[] table помечается как transient, но класс реализует writeObject(), в котором записывает содержимое таблицы ввода ObjectOutputStream.

Таким образом, содержимое Hashtable всегда сериализуется.

Почему они решили реализовать это таким образом? Вероятно, иметь контроль над тем, как массив сериализуется.

1 голос
/ 26 марта 2010

Поскольку в нем реализованы writeObject() и readObject() (в частных методах), с помощью которых он может управлять тем, как его сериализовать и десериализовать. Это примерно строка 800 в исходном коде Java 1.6.

Проверьте это Расширенное руководство по сериализации Sun , чтобы узнать, как оно работает "под капотами".

...