Siempre que una clase en el árbol de herencia implemente los interfaces Serializable o Externalizable, esa clase será serializable.
Todos los Bean deben persisitir. Para persistir, nuestros Beans deben soportar la serialización implementando los interfaces java.io.Serializable o java.io.Externalizable. Estos interfaces te ofrecen la elección entre serialización automática y "hazlo tu mismo".
El BeanBox escribe los Beans serializables a un fichero con la extensión .ser.
El Bean OurButton utiliza la serialización por defecto para conseguir la persistencia de sus propiedades. OurButton sólo añade Serializable a su definición de clase para hacer uso de la serialización por defecto:
public class OurButton extends Component implements Serializable,...
Si arrastramos un ejemplar de OurButton al BeanBox, la hoja de propiedades muestra las propiedades de OurButton. Lo que nos asegura que la serialización está funcionando.
El ejemplar OurButton aparecerá en el BeanBox con las propiedades modificadas intactas. Implementando Serializable en nuestra clase, las propiedades primitivas y los campos pueden ser serializados. Para miembros de la clase más complejos se necesita utilizar técnicas diferentes.
transient int Status;La serialización por defecto no serializa los campos transient y static.
private void writeObject(java.io.ObjectOutputStream out)
throws IOException;
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
Se puede controlar cómo se serializarán los objetos más complejos, escribiendo nuestras propias implementación de los métodos writeObject() y readObject(). Implementaremos writeObject cuando necesites ejercer mayor control sobre la serialización, cuando necesitemos serializar objetos que la serialización por defecto no puede manejar, o cuando necesitamos añadir datos a un canal de serialización que no son miembros del objeto. Implementaremos readObject() para recronstruir el canal de datos para escribir con writeObject().
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
s.writeInt(ourVersion);
s.writeObject(moleculeName);
}
private void readObject(java.io.ObjectInputStream s)
throws java.lang.ClassNotFoundException,
java.io.IOException {
// Compensate for missing constructor.
reset();
if (s.readInt() != ourVersion) {
throw new IOException("Molecule.readObject: version mismatch");
}
moleculeName = (String) s.readObject();
}
Estas implementaciones límitan los campos serializados a ourVersion y moleculeName. Ningún otro dato de la clase será serializado.
Es mejor utilizar los métodos defaultWriteObject() y defaultReadObject de ObjectInputStream antes de hacer nuestras propias especificaciones en el canal de escritura. Por ejemplo:
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
//First write out defaults
s.defaultWriteObject();
//...
}
private void readObject(java.io.ObjectInputStream s)
throws java.lang.ClassNotFoundException,
java.io.IOException {
//First read in defaults
s.defaultReadObject();
//...
}
ExternalizableButton implementa el interface Externalizable. Esto significa que hace toda su propia serialización, mediante la implementación de Externalizable.readExternal() y Externalizable.writeExternal().
El programa BlueButtonWriter es utilizado por los makefile de los botones para crear un ejemplar de ExternalizableButton, cambiar su propiedad background a azul, escribir el Bean en un fichero BlueButton.ser. OrangeButton se crea de la misma manera, utilizando OrangeButtonWriter. El makefile pone estos ficheros .ser en buttons.jar, donde el ToolBox puede encontrarlos y recontistuirlos.