Программирование на JAVA

Навигация

Лекция 1. Что такое Java? История создания

Лекция 2. Основы объектно-ориентированного программирования

Лекция 3. Лексика языка

Лекция 4. Типы данных

Лекция 5. Имена. Пакеты

Лекция 6. Объявление классов

Лекция 7. Преобразование типов

Лекция 8. Объектная модель в Java

Лекция 9. Массивы

Лекция 10. Операторы и структура кода. Исключения

Лекция 11. Пакет java.awt

Лекция 12. Потоки выполнения. Синхронизация

Лекция 13. Пакет java.lang

Лекция 14. Пакет java.util

Лекция 15. Пакет java.io

Лекция 16. Введение в сетевые протоколы

Create Parent

Create Child

Create Child2

Read objects:

Create Parent

Child@723d7c,first=old_first,last=old_last,age=2 Create Parent

Child2@22c95b,first=old__first,last=old_last,age=3,size=4

Во всех конструкторах вставлена строка, выводящая сообщение на консоль. Так можно отследить, какие конструкторы вызываются во время десериализации. Видно, что для объектов, порожденных от Serializable-классов, конструкторы не вызываются вовсе. Идет обращение лишь к конструктору без параметров He-Serializable-суперкласса.

Сравним значения полей первого объекта и его копии, получен­ной десериализацией. Поля, унаследованные от He-Serializable-клас-са (firstName, lastName), не восстановились. Они имеют значения, полученные в конструкторе Parent без параметров. Поля, объявлен­ные в Serializable-классе, свои значения сохранили. Это верно и для второго объекта — собственные поля Child2 и унаследованные от Child имеют точно такие же значения, что и до сериализации. Их зна­чения были записаны, а потом считаны и напрямую установлены из потока данных.

Иногда в классе есть поля, которые не должны участвовать в сериа­лизации. Тому может быть несколько причин. Например, это поле малосу­щественно (временная переменная) и сохранять его нет необходимости. Если сериализованный объект передается по сети, то исключение такого поля из сериализации позволяет уменьшить нагрузку на сеть и ускорить работу приложения.

Некоторые поля хранят значения, которые не будут иметь смысла при пересылке объекта на другую машину, или при воссоздании его спус­тя какое-то время. Например, сетевое соединение, или подключение к ба­зе данных, в таких случаях нужно устанавливать заново.

Затем, в объекте может храниться конфиденциальная информация, например, пароль. Если такое поле будет сериализовано и передано по сети, его значение может быть перехвачено и прочитано, или даже подменено.

Для исключения поля объекта из сериализации его необходимо объ­явить с модификатором transient. Например, следующий класс:

class Account implements java.io.Serializable { private String name; private String login; private transient String password; /* объявление других элементов класса

7

}

У такого класса поле password в сериализации участвовать не будет и при восстановлении оно получит значение по умолчанию (в данном случае null).