2011-03-03 9 views
12
public class Foo implements java.io.Serializable { 
    private int v1; 
    private static double v2; 
    private Loan v3 = new Loan(); 
} 

Opciones:
A. Una instancia de Foo se puede serializar porque Foo implementa Serializable.
B. Una instancia de Foo no se puede serializar porque Foo contiene una variable de instancia no serializable v3.
C. Si marca v3 como transitorio, una instancia de Foo es serializable.
D. b y c¿Cómo marcar un campo como transitorio hacen posible serializar un objeto

Respuesta: D

Explicación: Un objeto no puede ser serializado aunque su clase implementa java.io.Serializable, ya que puede contener variables de instancia no serializables.

Ahora mi pregunta es:

Por lo que yo sé, es transitoria used para apagar la serialización. Entonces, ¿cómo es transitorio en este caso, ayudándonos a serializar foo?

Respuesta

18

transient no deshabilita la serialización por completo; solo marca miembros que no serán serializados. Normalmente se usa para cosas que serían incorrectas o irrelevantes cuando el objeto no se serializa, o cosas que sería poco seguro almacenar (contraseñas, datos descifrados, ese tipo de cosas), o cosas no serializables que podrían ser fácilmente reconstruido

En este caso, supongo que la clase Loan no es serializable. (Si lo fuera, entonces A sería correcto.) Marcar v3 como transitorio simplemente le dice a Java que no se preocupe por ese campo, pero continúe y serialice los demás. Esto significa que un Foo no serializado podría tener un nulo v3. Si también desea almacenar el Loan, necesitará realizar un seguimiento de la información suficiente para recrearlo a voluntad, o cambiar la clase Loan para que implemente también java.io.Serializable.

Alternativamente, existen métodos que puede implementar (writeObject, readObject) si necesita control sobre la serialización. Pero eso puede ser un poco molesto.

0

Primero, ¿estás seguro de que el Préstamo no es serializable? Si es así, entonces B no se aplica.

Por otro lado, si no lo es, entonces B y C son correctos. transient no desactiva la serialización en general, sino solo para el campo al que está asociada. Por lo tanto, la serialización de Foo no transmitiría un valor para el campo v3. En el extremo receptor, al reiniciar la instancia de Foo, el mecanismo de serialización no trataría de leer ese campo de la secuencia, y lo dejaría nulo.

2

Entonces, ¿cómo es transitorio en este caso, nos ayuda a serializar foo?

Debido a que le permite serializar el resto de Foo, los otros miembros que son serializable.

Cuestiones relacionadas