Программирование на JAVA
Меню :
Стартовая
Основы программирования
Программирование на JAVA
Программирование на C++
Программирование на Pascal
Задачи по программированию
При попытке сериализовать объект, не имеющий такого интерфейса, будет брошен java.io.NotSerializableException.
Чтобы начать сериализацию объекта, нужен выходной поток OutputStream, в который и будет записываться сгенерированная последовательность байт. Этот поток передается в конструктор ObjectOutputStream. Затем вызовом метода writeObject() объект сериализуется и записывается в выходной поток. Например:
ByteArrayOutputStream os = new ByteArrayOutputStream(); Object objSave = new lnteger(1 );
ObjectOutputStream oos = new ObjectOutputStream(os); oos.writeObject(objSave);
Чтобы увидеть, во что превратился объект objSave, можно просмотреть содержимое массива:
byte[] bArray = os.toByteArray();
А чтобы восстановить объект, его нужно десериализовать из этого массива:
ByteArraylnputStream is = new ByteArraylnputStream(bArray); ObjectlnputStream ois = new ObjectlnputStream(is); Object objRead = ois.readObject();
Теперь можно убедиться, что восстановленный объект идентичен Исходному:
System.out.println("readed object is:" + objRead.toString()); System.out.println("Object equality is:" +
(objSave.equals(objRead))); System.out.println("Reference equality is:" + (objSave==objRead));
Результатом выполнения приведенного выше кода будет:
readed object is: 1 Object equality is: true Reference equality is: false
Как мы видим, восстановленный объект не совпадает с исходным (что очевидно — ведь восстановление могло происходить и на другой машине), но равен сериализованному по значению.
Как обычно, для упрощения в примере была опущена обработка ошибок. Однако, сериализация (десериализация) объектов довольно сложная процедура, поэтому возникающие сложности не всегда очевидны. Рассмотрим основные исключения, которые может генерировать метод readObject() класса ObjectlnputStream.
Предположим, объект некоторого класса TestClass был сериализован и передан по сети на другую машину для восстановления. Может случиться так, что у считывающей JVM на локальном диске не окажется описания этого класса (файл TestClass.class). Поскольку стандартный механизм се-риализации записывает в поток байт лишь состояние объекта, для успешной десериализации необходимо наличие описание класса. В результате будет брошено исключение ClassNotFoundException.