java - inicializar - ¿Por qué ArrayList usa almacenamiento transitorio?
list arraylist java (5)
Estaba leyendo la fuente de ArrayList de Java y encontré su declaración de matriz de respaldo:
private transient Object[] elementData;
¿Por qué esto tiene que ser transitorio? ¿Por qué esta clase no puede ser serializada?
¡Gracias por la ayuda!
¿Por qué esto tiene que ser transitorio?
Lo hace porque proporciona readObject
personalizados de readObject
y writeObject
que hacen un mejor trabajo de serialización que el predeterminado. Específicamente, el método writeObject escribe solo el tamaño y la secuencia de elementos. Esto evita la serialización del objeto de matriz privada que 1) tiene su propio encabezado y gastos generales, y 2) normalmente se rellena con null
s. El ahorro de espacio puede ser significativo.
(De hecho, no creo que el campo deba declararse estrictamente como transient
, pero ayuda a documentar la intención del desarrollador).
¿Por qué esta clase no puede ser serializada?
La clase ArrayList
en su conjunto puede ser serializada 1 . 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 intenta serializar una ArrayList
contiene referencias de Thread
, entonces obtendría una excepción de tiempo de ejecución para la primera referencia no nula.
La variable no es serializable.
- Si la variable no es serializable, entonces el mecanismo de serialización lanzará una excepción cuando intente 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, podríamos querer almacenar el resultado del cálculo para ahorrar algo de tiempo de procesador. Pero cuando enviamos el objeto a través del cable, podemos preocuparnos más por el consumo de ancho de banda y, por lo tanto, 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
Porque implementa la serialización explícita. Ver ArrayList # writeObject.
ArrayList
implementa Serializable
, por lo que puede ser serializado, por eso la matriz de respaldo privada es transient
, por lo que no se serializa junto con otros datos de la clase, ya que todo se maneja con los métodos writeObject
y readObject
.
Puede ser serializado; La clase ArrayList
solo se ocupa de las cosas en sí, en lugar de usar el mecanismo predeterminado. Mire los writeObject()
y readObject()
en esa clase, que son parte del mecanismo de serialización estándar.
Si observa la fuente, verá que writeObject()
no guarda la matriz de respaldo. En su lugar, serializa los elementos (incluidos los valores nulos) uno por uno hasta el límite de size()
. Esto evita la sobrecarga de serializar la matriz, y especialmente cualquier ranura no utilizada al final de la matriz. En la deserialización, una nueva matriz de respaldo del tamaño mínimo requerido es creada por readObject()
.