Las interfaces de marcador son un patrón de diseño con verificación de tipos en tiempo de ejecución que le permite asociar una interfaz y una clase. Para entender por qué esto podría ser necesario, considere un ejemplo de cómo marcar la clase Serializable con un marcador. Supongamos que necesitábamos guardar el estado de un objeto en la memoria y luego también poder descifrar lo que guardamos. Entonces, dices, podemos convertir nuestro objeto en un conjunto de bits. Bien. Podemos usar una forma simple de escribir en un archivo usando FileInputStream, pero esto solo es conveniente si hay pocos objetos, pero ¿qué pasa si hay muchos? Existe una maravillosa herramienta de serialización para esto. La regla principal cuando lo usa es que el objeto que se serializa debe contener todos los datos y no hacer referencia a otros objetos. Mira tu clase "Ajá, los campos no están referenciados y es bueno poner el marcador Serializable". Y cuando lo pongas, significará que los objetos que marcaste se pueden escribir en ObjectOutputStream. La clase ObjectOutputStream tiene un método writeObject0() y contiene comprobaciones de instancia de que verifican si el objeto se puede escribir y, si toda la serie de comprobaciones falla, se genera una excepción NotSerializableException y, si no, todo se escribe claramente en la memoria. Creemos una clase BigObject, cuyas instancias serializaremos.
package post1; import java.io.Serializable; public class BigObject implements Serializable { private int id; public void setId(final int id){ this.id = id; } public int getId() { return id; } }
La clase BigObject ya está marcada como Serializable. Tiene un campo de identificación y métodos get/set que lo acompañan. package post1; import post1.BigObject; import java.io.*; public class InterfaceMarker { public static void main(String[] args) throws IOException, ClassNotFoundException { int originalId = 12; BigObject objectOriginal = new BigObject(); objectOriginal.setId(originalId); ByteArrayOutputStream writeBuffer = new ByteArrayOutputStream(); ObjectOutputStream outputStream = new ObjectOutputStream(writeBuffer); outputStream.writeObject(objectOriginal); outputStream.close(); byte[] buffer = writeBuffer.toByteArray(); ByteArrayInputStream readBuffer = new ByteArrayInputStream(buffer); ObjectInputStream inputStream = new ObjectInputStream(readBuffer); BigObject objectCopy = (BigObject)inputStream.readObject(); if (objectCopy.getId() == originalId) System.out.println( "originalId equals copiedId"); } }
GO TO FULL VERSION