2009-06-09 16 views
16

He estado aprendiendo a usar Serializable.¿Quién realmente implementa métodos serializables?

Sé si creo una clase 'A' con diferentes variables que implementa Serializable y agrego Serializable a mi clase, también es Serializable.

Pero, ¿quién está implementando esos dos métodos para serializar? ¿Se ocupa Object de todo o de diferentes clases sobrecargándolas cuando sea necesario?

Respuesta

15

La serialización se implementa realmente en java.io.ObjectOutputStream (y java.io.ObjectInputStream) y algunas de sus clases de ayuda. En muchos casos, este soporte integrado es suficiente, y el desarrollador simplemente necesita implementar la interfaz de marcador Serializable. Esta interfaz se denomina "marcador" porque no declara ningún método y, por lo tanto, no requiere ninguna API especial en las clases de implementación.

Un programador puede agregar o reemplazar el mecanismo de serialización predeterminado con sus propios métodos si es necesario. Por ejemplo, si se requiere alguna inicialización adicional después de deserializar un objeto, un método puede ser añadido con la firma siguiente:

private void readObject(java.io.ObjectInputStream s) 
       throws java.io.IOException, java.lang.ClassNotFoundException 

Para el control total sobre la serialización y deserialización, implementar java.io.Externalizable en lugar de Serializable.

Hay muchos otros puntos de extensión en la serialización de Java, si es necesario. El serialization specification es una fuente autorizada y completa para aprender sobre todos ellos.

+1

Gracias. Creo que fui malentendido. Lo que realmente estaba preguntando es: si mi clase implementa serializable, quién se encarga de implementar los métodos de serialización. "... La serialización se implementa realmente en java.io.ObjectOutputStream (y java.io.ObjectInputStream) y algunas de sus clases de ayuda ..." parece la respuesta correcta. Gracias erickson! – Macarse

-1

Si implementa una clase que tiene que ser serializable, también debe proporcionar un método que haga la serialización en la misma clase.

No puede confiar en Object para poder adivinar qué clase necesita ser serializada y deserializada con éxito. Piense en las variables de trabajo de su clase, por ejemplo, que no necesitan ser serializadas, Object no podría diferenciarlas de los campos importantes.

+2

Para eso es la palabra clave transitoria: omitir esos campos al serializar un objeto. – Chochos

+1

La serialización predeterminada generalmente es correcta sobre qué hacer. Si hay campos 'sin importancia', ¿por qué incluso tenerlos en su objeto? – Jorn

+1

¿Qué quiere decir con "tener que"? –

7

Supongo que los métodos de los que está hablando son readObject() y writeObject(). Solo necesita implementarlos si necesita hacer una serialización personalizada, por ejemplo, cuando tiene campos en su objeto que no son serializables. Si solo tiene campos y primitivas serializables, no tiene que implementar métodos de serialización personalizados. Además, puede omitir algunos campos en la serialización agregando la palabra clave transient.

1

Sé si creo una clase 'A' con diferentes variables que implementa Serializable y agrego Serializable a mi clase, también es Serializable.

Sí, en este momento su clase es Serializable.

+1

La cita incluye 'diferentes variables que implementan Serializable' –

3

Mire API doc de Serializable, explica el mecanismo en detalle.

Básicamente, no tiene que hacer nada a menos que desee más control sobre cómo se serializan sus objetos, en cuyo caso hay algunos métodos "mágicos" que puede implementar y que serán llamados por el mecanismo de serialización.

Si desea un control total, puede usar Externalizable en su lugar.

1

Para que una clase sea serializable, cada objeto contenido como miembro de esa clase también debe ser serializable. Java ejecutará el árbol de todos los objetos a los que hace referencia el suyo y los serializará uno por uno.

Si usted quiere tener un mayor control sobre cómo los objetos son serializados, se puede implementar la interfaz Externalizable:

Los writeExternal y readExternal métodos de la interfaz Externalizable son ejecutadas por una clase para dar la control completo de clase sobre el formato y contenido de la secuencia para un objeto y sus supertipos .

Cuestiones relacionadas