2012-02-04 12 views
23

Estaba viendo la fuente de HashMap.¿Por qué la tabla hash de HashMap está marcada como transitoria aunque la clase es serializable?

A HashMapimplements Serializable.

Ok esto es para que pueda ser peristed/transmitido como un objeto.

Pero veo que la tabla hash misma está marcada como transient.

No entiendo esto. Si lo marca como transitorio, ¿no significa que debería no ser serializado?

Pero todos los datos están en la tabla. Entonces, ¿por qué es transient?

Quizás estoy confundido sobre cómo funciona Serializable?

Respuesta

31

HashMap usa writeObject y readObject para implementar la serialización personalizada en lugar de simplemente dejar que su campo se serialice normalmente. Escribe el número de segmentos, el tamaño total y cada una de las entradas en la secuencia y se reconstruye a sí mismo desde esos campos cuando se deserializa. Como dice tzaman, la tabla en sí misma no es necesaria en el formulario en serie, por lo que no se serializa para ahorrar espacio.

Puede leer más sobre esos métodos y algunos otros métodos de hacer serialización personalizada (writeReplace y readResolve) en el Serializable javadoc.

+0

Veo estos métodos. Me preguntaba por qué lo hace de esa manera? ¿Hay alguna razón? – Cratylus

+9

El código hash de los objetos puede cambiar entre ejecuciones del programa; por ejemplo, si hashCode() usa la implementación predeterminada de Object, por lo que la tabla hash debe reconstruirse durante la deserialización. –

11

La palabra clave transient indica que un campo no se debe incluir en la representación serializada de una clase. La tabla Entry[] de HashMap es simplemente una estructura de aceleración, que permite una búsqueda rápida de las entradas almacenadas. No es necesario serializar la tabla completa, solo las entradas que contiene, ya que la tabla se puede reconstruir nuevamente cuando se deserializa de la lista de entradas.

+0

¿Es esto para tamaño o velocidad? Porque en deserialización terminas con una mesa del mismo tamaño de todos modos. – Cratylus

+1

Tamaño. La tabla 'Entrada' es más grande que la lista de teclas. – tzaman

Cuestiones relacionadas