2011-11-05 11 views
11

Aunque sorprendentemente la interfaz java.io.Serializable public interface Serializable{} no contiene ningún método y campo en Java, la clase que implementa esta interfaz puede lograr la función de serialización y deserialización (el estado del objeto que se está serializando o deserializando) . ¿Cómo puede lograr la función de serialización y deserialización sin ningún método o campo en Java?Aunque la interfaz Serializable en Java no tiene métodos, ni campos, puede lograr su función. ¿Cómo?

Respuesta

11

Algunas interfaces solo sirven como "marcadores" o "banderas".

Se accede al UID y a lectores/escritores personalizados por reflexión.

Serializable es un marcador, y el JRE/JVM puede tomar acción (es) en función de su presencia.

http://en.wikipedia.org/wiki/Marker_interface_pattern

1

La interfaz Serializable es una interfaz de marcador que sólo notifica JVM que un objeto determinado se fija para ser serializado. El proceso de serialización ocurre internamente.

2

Serializable no contiene ningún método, que es el ObjectOutputStreamObjectInputStream y clases que pueden hacer que el trabajo, a través de los métodos writeObject y readObject.

Serializable es solo una interfaz de marcador, en otras palabras, solo pone una bandera, sin requerir ningún campo o método.

1

Un diseño mejor hubiera sido

interface Serializable 

    void writeObject(ObjectOutputStream out) 

    void readObject(ObjectInputStream in) 

El problema es que no hay manera de proporcionar implementaciones predeterminadas; entonces cada subclase debe implementar estos dos métodos, lo cual es una molestia.

class MyClass implements Serializable 

    // stupid boilerplate code 
    void writeObject(ObjectOutputStream out) 
    { 
     Util.defaultWriteObject(this, out); 
    } 

En Java 8, esto va a cambiar, podemos tener impls por defecto de los métodos de interfaz

interface Serializable 

    void writeObject(ObjectOutputStream out) default Util::defaultWriteObject 

    void readObject(ObjectInputStream in) default Util::defaultReadObject 

(Serializable no cambiará, pero la nueva función se puede utilizar en casos comparables)

+0

puede implementar java.io.Externalizable para tener control sobre serialización y deserialización –

0

Estoy de acuerdo con irreputable, especialmente el aseveración implícita de que cada objeto debe saber cómo serializar/deserializar sí mismo, si él/ella afirmación de que:

no hay manera de proporcionar implementationsckquote predeterminado

Seguro que hay: Object Composition.

0

La serialización es una forma de guardar objetos y utilizamos la interfaz Serializable para lograr nuestro objetivo. La interfaz serializable es una interfaz de marcador. El patrón de interfaz de marcador es un patrón de diseño y proporciona información de tiempo de ejecución sobre objetos.

+0

¿No es eso lo que todos dijeron hace seis años? –

0

Si ve la implementación de writeObject método de ObjectOutputStream, después de un fragmento de código verá dentro de la implementación.

Aquí se puede ver, si la clase no está implementando la interfaz Serializable, entonces NotSerializableException se lanza.

if (obj instanceof String) { 
    writeString((String) obj, unshared); 
} else if (cl.isArray()) { 
    writeArray(obj, desc, unshared); 
} else if (obj instanceof Enum) { 
    writeEnum((Enum<?>) obj, desc, unshared); 
} else if (obj instanceof Serializable) { 
    writeOrdinaryObject(obj, desc, unshared); 
} else { 
    if (extendedDebugInfo) { 
     throw new NotSerializableException(
      cl.getName() + "\n" + debugInfoStack.toString()); 
    } else { 
     throw new NotSerializableException(cl.getName()); 
    } 
} 

Serializable es sólo una interfaz de marcador. Java internamente use esto para comprobar que si el objeto es realmente escribible o no.

Cuestiones relacionadas