2009-05-18 26 views
8

Si una pregunta similar ya está publicada en stackoverflow, los pls solo publican el enlace.¿Por qué es necesario marcar una clase como serializable?

¿Cuál es la necesidad de implementar una interfaz Serializable (sin métodos) para objetos que se serializarán? La API de Java dice - - Si no está implementada, arrojará java.io.NotSerializableException.

Eso es debido al código siguiente en ObjectOutputStream.java

............................ 

writeObject0(Object obj, boolean unshared){ 
............. 
} else if (cl.isArray()) { 
     writeArray(obj, desc, unshared); 
     } else if (obj instanceof Serializable) { 
     writeOrdinaryObject(obj, desc, unshared); 
     } else { 
     throw new NotSerializableException(cl.getName()); 
     } 
................ 

Pero mi pregunta es por qué su necesaria para implementar Serializable y con ello informar o dicen Java/JVM que una clase se puede serializar. (¿Es solo para evitar la excepción?).

En este caso, si escribimos una funcionalidad similar que escribe objetos en flujos sin comprobar si la clase en una instancia de Serializable, ¿se serializarán los objetos de una clase que no implemente Serializable?

Cualquier ayuda es apreciada.

+3

Dupe of http://stackoverflow.com/questions/441196/why-java-needs-serializable-interface –

+0

[Esta pregunta] (http://stackoverflow.com/questions/441196/why-java-needs- serializable-interface) tiene algunas buenas respuestas a esto. – jwoolard

Respuesta

4

Es una buena pregunta. El Serializable se conoce como marker interface, y se puede ver como una etiqueta en una clase para identificar que tiene capacidades o comportamientos. p.ej. puede usar esto para identificar las clases que desea serializar que no tienen definida serialVersionUid (y esto puede ser un error).

Tenga en cuenta que la biblioteca de serialización comúnmente utilizada XStream (y otras) no requieren que se pueda definir Serializable.

2

Se necesita para que la JVM pueda saber si una clase se puede serializar de forma segura o no. Algunas cosas (conexiones de bases de datos, por ejemplo) contienen estados o conexiones a recursos externos que realmente no se pueden serializar.

También, usted quiere asegurarse de que se pone un miembro serialVersionUID en cada clase serializable para asegurar que los objetos serializados se pueden des-serializar después de un cambio de código o volver a compilar:

// Set to some arbitrary number. 
// Change if the definition/structure of the class changes. 
private static final long serialVersionUID = 1; 
0

La razón es que no todas las clases se pueden serializar. Ejemplos:

  • E/S cosas: InputStream, conexiones HTTP, canales. Dependen de objetos creados fuera del alcance de la máquina virtual de Java y no existe una forma sencilla de restaurarlos.

  • recursos del sistema operativo como Windows, imágenes, etc.

2

La serialización le permite guardar objetos directamente a los archivos binarios sin tener que analizar en texto, escribir la cadena y luego crear un nuevo objeto y analizar las entradas de cadena cuando se vuelve a leer. El objetivo principal es permitirle guardar objetos con todos sus datos en un archivo binario. Me pareció extremadamente útil cuando tenía que trabajar con listas vinculadas que contenían muchos objetos del mismo tipo y necesitaba guardarlos y abrirlos.

+0

Esa es una respuesta a la pregunta "¿Por qué es útil la serialización?" –

+0

Pero también responde por qué tiene que marcarlo como serializable para usar archivos binarios y escribir/leer objetos. – FloppyDisk

Cuestiones relacionadas