Serializar Objetos
Reconstruir un objeto desde un stream requier primero que el objeto se haya escrito en un stream. Por eso empezaremos por aquí:
¿Cómo Escribir en un ObjectOutputStream?
Escribir objetos a un stream es un proceso sencillo. Por ejemplo, aquí obtenemos la hora actual en milisegundos construyendo un objeto Date y luego serializamos ese objeto.
FileOutputStream out = new FileOutputStream("theTime");
ObjectOutputStream s = new ObjectOutputStream(out);
s.writeObject("Today");
s.writeObject(new Date());
s.flush();
ObjectOutputStream es un stream de proceso, por eso debe construirse sobre otro stream. Este código construye un ObjectOutputStream sobre un FileOutputStream, para serializar el objeto a un fichero llamado theTime.
Luego, el string Today y un objeto Date se escriben en el stream con el método writeObject de ObjectOutputStream.
Si un objeto se refiere a otro objeto, entonces todos los objetos que son alcanzables desde el primero deben ser escritos al mismo tiempo para poder mantener la relación entre ellos. Así, el método writeObject serializa el objeto especificado, sigue sus referencias a otros objetos recursivamente, y también los escribe todos.
El stream ObjectOutputStream implementa el interface DataOutput que define muchos métodos para escribir tipos de datos primitivos, como writeInt, writeFloat, o writeUTF. Podemos usar estos métodos para escribir tipos de datos primitivos a un
ObjectOutputStream.
El método writeObject lanza una NotSerializableException si el objeto dado no es serializable. Un objeto es serializable sólo si clase implementa el interface Serializable.
¿Cómo Leer desde un ObjectInputStream?
Una vez que hemos escrito objetos y tipos de datos primitivos en un stream, querremos leerlos de nuevo y reconstruir los objetos. Esto también es sencillo. Aquí está el código que lee el String y el objeto Date que se escribieron en el fichero llamado theTime del último ejemplo.
FileInputStream in = new FileInputStream("theTime");
ObjectInputStream s = new ObjectInputStream(in);
String today = (String)s.readObject();
Date date = (Date)s.readObject();
Cómo ObjectOutputStream, ObjectInputStream debe construirse sobre otro stream. En este ejemplo, los objetos fueros archivados en un fichero, por eso el código construye un ObjectInputStream sobre un FileInputStream. Luego, el código usa el método readObject de ObjectInputStream para leer el String y el objeto Date desde el fichero. Los objetos deben ser leídos desde el stream en el mismo orden en que se esribieron. Observa que el valor de retorno de readObject es un objeto que es forzado y asignado a un tipo específico.
El método readObject des-serializa el siguiente objeto en el stream y revisa sus referencias a otros objetos recursivamente para des-serializar todos los objetos que son alcanzables desde él. De esta forma, mantiene la relación entre los objetos.
El stream ObjectInputStream implementa el interface DataInput que define métodos para leer tipos de datos primitivos. Los métodos de DataInput son paralelos a los definidos en DataOutput para escribir tipos de datos primitivos. Entre ellos se incluyen readInt, readFloat, y readUTF. Se usan estos métodos para leer tipos de datos primitivos desde un ObjectInputStream.