java - example - objectoutputstream para que sirve
¿Por qué ObjectOutputStream.writeObject no toma un Serializable? (2)
¿Por qué ObjectOutputStream.writeObject(Object o)
no toma un Serializable
? ¿Por qué está tomando un Object
?
Debería ser ObjectOutputStream.writeObject(serializable)
lugar de ObjectOutputStream. writeObject(Object)
ObjectOutputStream. writeObject(Object)
. Es un caso de uso adecuado donde una interfaz de marcador como Serializable
debería haberse utilizado, pero desafortunadamente no. Esto hubiera hecho posible el beneficio real de la verificación de tipos en tiempo de compilación en lugar de fallar en el tiempo de ejecución si el objeto no implementa la interfaz Serializable
.
Me gustaría aprovechar esta oportunidad para mencionar lo que Joshua Bloch ha mencionado en su libro Effective java :
Una interfaz de marcador es una interfaz que no contiene declaraciones de métodos, sino que simplemente designa (o "marca") una clase que implementa la interfaz como que tiene alguna propiedad. Por ejemplo, considere la interfaz Serializable. Al implementar esta interfaz, una clase indica que sus instancias se pueden escribir en un
ObjectOutputStream
(o "serializado").En el caso de la interfaz del marcador
Serializable
, elObjectOutputStream.write(Object)
fallará si su argumento no implementa la interfaz. Inexplicablemente, los autores de la APIObjectOutputStream
no aprovecharon la interfazSerializable
para declarar el método de escritura. El tipo de argumento del método debería haber sidoSerializable
lugar deObject
. Tal como está, un intento de llamar aObjectOutputStream.write
en un objeto que no implementaSerializable
fallará solo en tiempo de ejecución, pero no tuvo que ser así.
Esto se debe a que writeObject
en ObjectOutputStream
reemplaza el método en la interfaz ObjectOutput
que no requiere que el objeto sea Serializable
.
La interfaz ObjectOutput
especifica métodos que permiten que los objetos se escriban en una secuencia o en un almacenamiento subyacente, pero esto puede lograrse mediante un proceso distinto de la serialización. El ObjectOutputStream
implementa esta funcionalidad, pero requiere objetos serializables. Sin embargo, no puede modificar la firma de la interfaz que implementa.