Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры-2 оопип часть 4.doc
Скачиваний:
47
Добавлен:
01.04.2014
Размер:
445.44 Кб
Скачать

34. Сериализация

Сериализация это процесс сохранения состояния объекта в последовательность байт;

Сериализация объектов Java позволяет вам взять любой объект, который реализует интерфейс Serializable и включит его в последовательность байт, которые могут быть полностью восстановлены для регенерации оригинального объекта. Это также выполняется при передаче по сети, что означает, что механизм сериализации автоматически поддерживается на различных операционных системах. То есть, вы можете создать объект на машине с Windows, сериализовать его и послать по сети на Unix машину, где он будет корректно реконструирован. Вам не нужно будет беспокоиться о представлении данных на различных машинах, порядке следования байт и любых других деталях.

Сама по себе сериализация объектов очень интересна, потому что это позволяет вам реализовать устойчивую живучесть. Помните, что живучесть означает, что продолжительность жизни объектов не определяется тем, выполняется ли программа — объекты живут в промежутках между вызовами программы. Вы берете сериализованный объект и записываете его на диск, затем восстанавливаете объект при новом вызове программы, таким образом, вы способны обеспечить эффективную живучесть. Причина названия “устойчивая” в том, что вы не можете просто определить объект, используя какой-либо вид ключевого слова “устойчивый”, и позволить системе заботиться о деталях (хотя это может случиться в будущем). import java.io.Serializable;

Сериализация объекта достаточно проста, если объект реализует интерфейс Serializable (этот интерфейс похож на флаг и не имеет методов). Когда сериализация была добавлена в язык, многие стандартные библиотеки классов были изменены, чтобы сделать их сериализованными, включая все оболочки примитивных типов, все контейнерные классы и многие другие. Даже объект Class может быть сериализован. (Смотрите Главу 12 о реализации этого.)

Для сериализации объекта вы создаете определенный сорт объекта OutputStream, а затем вкладываете его в объект ObjectOutputStream. После этого вам достаточно вызвать writeObject( ) и ваш объект будет сериализован и послан в OutputStream. Чтобы провести обратный процесс, вы вкладываете InputStream внутрь ObjectInputStream и вызываете readObject( ). То, что приходит, обычно это ссылка на родительский Object, так что вы должны выполнить обратное приведение, чтобы сделать вещи правильными.

class TestSerial implements Serializable {

public byte version = 100;

public byte count = 0;

}

public static void main(String args[]) throws IOException {

FileOutputStream fos = new FileOutputStream("temp.out");

ObjectOutputStream oos = new ObjectOutputStream(fos);

TestSerial ts = new TestSerial();

oos.writeObject(ts);

oos.flush();

oos.close();

}

35. Обработка исключений в Java

Исключительные ситуации - это аварийные ситуации, которые могут возникнуть во время выполнения программы. В Java исключительные ситуации могут генерироваться либо исполнительной системой JAVA (некоторые фундаментальные ошибки), либо программным кодом(вручную), для сообщения вызывающей программе о некоторой аварийной ситуации. При возникновении исключения, оно должно быть захвачено обработчиком, если таковой определен программистом, или обработчиком по-умолчанию. В последнем случае выдается сообщение, описывающее исключение, формируется определенная дополнительная информация(трасса стека от точки где произошло исключения) и программа завершается. Если это нежелательно, то необходимо предусмотреть обработку. Обработка исключений реализуется через создание объекта, представляющего исключение, который «вбрасывается» в метод, вызвавший ошибку, при помощи ключевых слов: try, catch, trow, trowes, finally. Ключи try, catch, finally используются для формирования блока обработки исключений:

try { //фрагмент программы, в котором в котором возможно

//возникновение ошибки

catch { Имя _класса-исключения_1 имя объекта_1

{// обработка исключений для имя _класса_исключение 1

}

catch {имя класса_исключения_2 имя объекта_2

{//обработчик исключений для имя класса_исключения_2 }

[finally {//блок кода обработки перед выходом из try, например для закрытия открытых файлов}]. Если какое-то исключение возникнет оно должно быть захвачено обработчиком. Если такой обработчик не определен, то оно захватывается обработчиком по умолчанию

Обычно, в этом случае выдается сообщение, описывающее исключение, формируется некоторая дополнительная информация и программа завершается.

Программа сама может вызвать исключительную ситуацию (ручной выброс исключения при помощи throw (по желанию программиста)). Если это нежелательно, т.е если нежелательное стандартное завершение исключительной ситуации, то необходимо предусмотреть обработку. Для чего в программе используется инструкция trow, например

Class TrowDemo

Static void demoproc ( ) {

try { //этот класс не может быть простым типом, а должен

// принадлежать иерархии throwable

throw new NullPointer Exception e1 ;

//создается объект с описанием исключения,

//которое может быть выдано на экран.

} catch (NullPointer Exception e1)

//захват исключения внутри demoproc

{ System.out.println («возникло исключение внутри блока»)

throw e; // повторно выбрасывает исключение во внешний блок,

} } //где оно рассматривается уже как встроенное.

//NullPointer Exception - недопустимое использование нулевой //ссылки.

рublic static void main (String arys [ ]) {

try { demoproc ( ) ;} catch (NullPointer Exception)

{System.out.println («Повторный захват:» +е);

//выводится текст на экран.

trows используется для определения возможных исключений, которые метод может создать, но не образовывает.

Все такие исключения, которые создаются в методе (кроме RuntimeException, Error и их подклассов), должны быть объявлены в предложении throws в заголовке метода, для них должны быть предусмотрены блоки cath в вызывающем блоке. Формат:

Тип_метода имя_метода (список параметров) trows список исключений

Пример, возможно не нужен на лекции

Class TrowDemo { static void trowone

Trows IllegelAccessException («демонстрация»)

}

public static void main (String args [ ])

{try { throwone ( );}

catch (Trows IllegelAccessExceptionе)

{System.out.println («Выброс» + е) }}}

исключения описаны внутри пакета java.lang исключения который неявно импортирован во все классы программы. Большинство исключений класса RuntineException и подклассов Exception встроены (доступны автоматически). Они не компилируются (не проверяются) компилятором и именуются неконтролируемыми исключениями.

Другие, такие как ClassNotFoundException (класс не найден), NoSuchFildException, NoSuchMothodException и др.( такой метод не существует) (контролируемые) должны быть внесены в список trows, если метод может генерировать какое-то из них, но не обрабатывает его (смотри Help).

Собственные подклассы исключений можно создавать наследованием (extends) от класса Exception, получая таким образом доступ к методам, класса Throwable.