2012-03-24 10 views
19

que estaba leyendo la fuente de ArrayList de Java y me encontré con su respaldo declaración de matriz:¿Por qué ArrayList usa almacenamiento transitorio?

private transient Object[] elementData; 

¿Por qué esta necesidad de ser transitoria? ¿Por qué esta clase no puede ser serializada?

¡Gracias por la ayuda!

Respuesta

23

Es puede ser serializado; la clase ArrayList solo se ocupa de las cosas, en lugar de usar el mecanismo predeterminado. Mire los métodos writeObject() y readObject() en esa clase, que son parte del mecanismo de serialización estándar.

Si mira la fuente, verá que writeObject() no guarda la matriz de respaldo. En cambio, serializa los elementos (incluidos los valores nulos) de a uno por vez hasta el límite de size(). Esto evita los gastos generales de serialización de la matriz, y especialmente las ranuras no utilizadas al final de la matriz. En la deserialización, se crea una nueva matriz de respaldo del tamaño mínimo requerido por readObject().

5

¿Por qué tiene que ser transitorio?

Para ello, ya que proporciona la costumbre readObject y writeObject métodos que hacen un mejor trabajo de serialización de la predeterminada. Específicamente, el método writeObject escribe solo el tamaño y la secuencia de elementos. Esto evita serializar el objeto de matriz privado que 1) tiene su propio encabezado y gastos generales, y 2) generalmente está rellenado con null s. El ahorro de espacio puede ser significativo.

(De hecho, no creo que el campo estrictamente necesita ser declarado como transient en absoluto, pero sí ayuda a documentar la intención del desarrollador.)

Por qué puede' ¿Esta clase debe ser serializada?

La clase ArrayList como un todo se puede serializar . El Object[] podría ser serializado, pero eligieron implementarlo de otra manera.


1 - En realidad, esto depende de los tipos de tiempo de ejecución de los elementos. Por ejemplo, si intentó serializar un ArrayList que contiene referencias Thread, entonces obtendría una excepción de tiempo de ejecución para la primera referencia no nula.

1

Porque implementa una serialización explícita. Ver ArrayList # writeObject.

3

ArrayList implementa Serializable, por lo que puede ser serializado, eso es exactamente por qué la matriz respaldo privado es transient, por lo que no es de serie junto con otros datos de la clase, ya que todo está en manos de ArrayList 's writeObject y readObject métodos.

1

la variable no es serializable

  • Si la variable no es serializable, entonces el mecanismo de serialización arrojará una excepción cuando se intenta serializar la variable. Para evitar esto, puede declarar que la variable es transitoria.

La variable es redundante

  • Supongamos que la instancia almacena en caché el resultado de un cálculo. Localmente, es posible que deseemos para almacenar el resultado del cálculo, a fin de ahorrar algo de tiempo del procesador. Pero cuando enviamos el objeto por cable, podemos preocuparnos más por consumir ancho de banda y descartar el cálculo en caché, ya que siempre podemos regenerarlo más adelante.

enlace: http://onjava.com/pub/a/onjava/excerpt/JavaRMI_10/index.html?page=3

Cuestiones relacionadas