sirve que para example java serialization marker-interfaces

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 , el ObjectOutputStream.write(Object) fallará si su argumento no implementa la interfaz. Inexplicablemente, los autores de la API ObjectOutputStream no aprovecharon la interfaz Serializable para declarar el método de escritura. El tipo de argumento del método debería haber sido Serializable lugar de Object . Tal como está, un intento de llamar a ObjectOutputStream.write en un objeto que no implementa Serializable 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.