variable - ¿Por qué Java.lang.Object no implementa la interfaz Serializable?
serializacion c++ (4)
Todos los subtipos de una clase serializable son ellos mismos serializables.
En otras palabras: todas las clases que alguna vez creaste, fueron o serán creadas son todas serializables. transient
solo excluye campos, no clases enteras.
Este es un potencial agujero de seguridad - por coincidencia puede serializar, por ejemplo, su DataSource
con credenciales de base de datos dentro - si el creador de esta implementación de DataSource
particular se olvidó de hacer esos campos transient
. Es sorprendentemente fácil serializar un objeto aleatorio de Java, por ejemplo, a través de clases internas que contienen una referencia implícita a this
externo.
Es más seguro usar 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).
Posible duplicado:
¿Por qué Java necesita una interfaz Serializable?
De acuerdo con Serializability en documentos Java:
La clase que implementa la interfaz java.io.Serializable habilita la serialización de una clase. 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 sirve solo para identificar la semántica de ser serializable
¿Por qué el Objeto ya no implementa Serializable
? Los miembros que no nos gustaría ser serializables se pueden hacer de forma transient
. ¿Por qué prevenir la Serializabilidad por defecto?
Creo que tiene más sentido implementar Serializable
para los objetos que necesitan persistir y declarar que todos los campos de la clase transiennt
serán más engorrosos. Otro punto del que no estoy seguro es que Object
sea la raíz de todas las clases, lo que incluye clases relacionadas con la reflexión, por lo que será inapropiado implementar Serializable para la clase Object.
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, probablemente escribirías algo como:
/** DON''T SERIALIZE IT!!! */
class Connection { ... }
y es mejor tener un idioma o función de biblioteca que comentarios.
1. Serializable
es la interfaz del 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 java.lang.Object no implementó Serializable es porque, ¿qué pasa si NO quieres que ciertos campos sean Serializables y que mi error se haya perdido para agregar transitorios a ese campo, entonces será un caos.
3. Al hacer que el programador implemente Serializable para su clase, el programador toma conciencia de que lo ha implementado conscientemente y debe tomar las medidas necesarias para evitar que se serialice algo que no debería ser.