2012-07-22 28 views
31

Duplicar posible:
Why Java needs Serializable interface?¿Por qué Java.lang.Object no implementa la interfaz serializable?

Según Serializabilidad en documentos de Java:

Serializabilidad de una clase está habilitado de la clase que implementa el java.io.Serializable interfaz. Las clases que no implementen esta interfaz no tendrán serialización ni deserialización en ninguno de sus estados. Todos los subtipos de una clase serializable son ellos mismos serializables. La interfaz de serialización no tiene métodos o campos y sólo sirve para identificar la semántica de ser serializable

¿Por qué no el objeto ya implementar Serializable? Los miembros que no nos gustaría ser serializables pueden hacerse como transient. ¿Por qué prevenir la Serializabilidad por defecto?

+2

[Esta pregunta] (http://stackoverflow.com/questions/441196/why-java-needs-serializable-interface) contiene algunas buenas respuestas que podrían interesarle. – Pshemo

+0

De hecho. Debería haber intentado palabras clave alternativas antes de publicar :) –

Respuesta

40

Todos los subtipos de una clase serializable son ellos mismos serializables.

En otras palabras: todas las clases alguna vez creados, fueron o serán creados son todos serializable. transient solo excluye campos, no clases enteras.

Esto es un agujero de seguridad potencial - por coincidencia puede serializar, p. Ej. su DataSource con credenciales de base de datos dentro - si el creador de esta implementación particular DataSource olvidó hacer tales campos transient. Es sorprendentemente fácil serializar un objeto aleatorio de Java, p. a través de clases internas que contienen una referencia implícita al exterior this.

Es más seguro utilizar la lista blanca de clases que explícitamente desea y permitir serializar en lugar de examinar cuidadosamente su código, asegurándose de que no se serialicen campos que no desea.

Además, ya no puede decir: MySuperSecretClass no es serializable (simplemente no implementa Serializable) - solo puede excluir las agallas (campos).

+0

Bien, creo que me perdí completamente el aspecto de seguridad. Tiene sentido. ¿Pero no utilizamos Private/Public/Protected para el acceso en tiempo de compilación? ¿No se ha podido hacer que transitorios o algo similar sea un mandato para el tiempo de ejecución? Sólo preguntaba. O hubiera sido simplemente engorroso. –

+3

@ TJ-: En mi humilde opinión, solo una pequeña fracción de las clases necesita ser serializable (objetos de valor, DTO). Marcar las clases que necesitan ser serializables es mucho más conveniente que marcar aquellas que no lo hacen. No es que Java no sea engorroso en ese sentido: de nuevo, en mi humilde opinión, todos los campos deben ser privados y todos los métodos son públicos por defecto, pero ¿qué puedes hacer? –

5

La mayoría de las clases no necesitan ser serializables. Con el diseño actual, puede observar fácilmente que la clase es serializable. Básicamente, es solo una auto-documentación comprobada por el compilador. De lo contrario, es probable que escribir algo como:

/** DON'T SERIALIZE IT!!! */ 
class Connection { ... } 

y es mejor tener característica del lenguaje o de la biblioteca de comentarios.

1

Creo que tiene más sentido implementar Serializable para objetos que necesitan persistir y declarar cada campo de la clase transiennt será más engorroso. Otro punto del que no estoy seguro es que Object es la raíz de todas las clases, que incluye clases relacionadas con la reflexión, por lo que será inapropiado implementar Serializable para la clase Object.

13

1.Serializable es interfaz de marcador, que está vacía, pero cuando una clase está marcada Serializable significa que sus objetos son serializables.

2. La razón por la que aún no ha java.lang.Object implementar Serializable se debe a que, lo que si no lo hace quiere hacer ciertos campos como Serializable y mi error se perdió añadir transitoria a ese campo, entonces será una estragos.

3. Al hacer el programador implementar Serializable para su clase, se hace una toma de conciencia entre el programador que ha puesto en práctica conscientemente, y debe tomar los pasos necesarios para prevenir cualquier cosa que ser serializado que no debe ser.

Cuestiones relacionadas