Сериализация объектов
Листинг 18.6. Сериализация объекта.
import java.io.*; import java.util.*; class SerDatef public static void main(String[] args) throws Exception{ GregorianCaiendar d – new GregorianCaiendar(); QbjectOutputStream oos = new ObjectOutputStream{ new FileOutputStream("date.ser")); oos.writeObject(d); oos.flush(); oos.close(); Thread.sleep(3000); ObjectlnputStream ois = new ObjectlnputStream( new FileInputStream("date.ser")); GregorianCaiendar oldDate = (GregorianCaiendar)ois.readObject(); ois.close(); GregorianCaiendar newDate = new GregorianCaiendar(); System.out.println("Old time = " + oldDate.get(Calendar.HOUR) + ":" + oldDate.get(Calendar.MINUTE) +":" + oldDate.get(Calendar.SECOND) +"\nNew time = " + newDate.get(Calendar.HOUR) +":" + newDate.get(Calendar.MINUTE) +":" + newDate.get(Calendar.SECOND)); } }
Рис.18.7. Сериализация объекта
Если не нужно сериализовать какое-то поле, то достаточно пометить его служебным словом transient, например:
transient MyClass me = new MyClass("abc", -12, 5.67e-5);
Метод writeObject() не записывает в выходной поток поля, помеченные static и transient. Впрочем, это положение можно изменить, переопределив метод writeObject() или задав список сериализуемых полей.
Вообще процесс сериализации можно полностью настроить под свои нужды, переопределив методы ввода/вывода и воспользовавшись вспомогательными классами. Можно даже взять весь процесс на себя, реализовав не интерфейс Serializable, а интерфейс Externalizable, но тогда придется реали-зовать методы readExternal () и writeExternal (), выполняющие ввод/вывод.
Эти действия выходят за рамки книги. Если вам необходимо полностью освоить процесс сериализации, то обратитесь к спецификации Java Object Serialization Specification, расположенной среди документации J2SDK в каталоге docs\guide\serialization\spec\. Там же есть и примеры программ, реализующих эту спецификацию.