Государственный


Десериализация. Класс ObjectInputStream



бет15/25
Дата05.04.2024
өлшемі4.07 Mb.
#497748
1   ...   11   12   13   14   15   16   17   18   ...   25
Java. Потоки ввода-вывода. Работа с файлами. Кравчук А.С., Кравчук А.И., Кремень Е.В

Десериализация. Класс ObjectInputStream


Класс ObjectInputStream отвечает за обратный процесс - чтение ранее сериализованных данных из потока. В конструкторе он принимает ссылку на поток ввода:

ObjectInputStream(InputStream in)


Функционал ObjectInputStream сосредоточен в методах, предназначенных для чтения различных типов данных. Рассмотрим основные методы этого класса:


void close() - закрывает поток;
int skipBytes(int len) - пропускает при чтении несколько байт, количество которых равно len;
int available() - возвращает количество байт, доступных для чтения;
int read() - считывает из потока один байт и возвращает его целочисленное представление;
boolean readBoolean() - считывает из потока одно значение
boolean;
byte readByte() - считывает из потока один байт;
char readChar() - считывает из потока один символ char; double readDouble() - считывает значение типа double; float readFloat() - считывает из потока значение типа float; int readInt() - считывает целочисленное значение int;
long readLong() - считывает значение типа long; short readShort() - считывает значение типа short;
String readUTF() - считывает строку в кодировке UTF-8; Object readObject() - считывает из потока объект.


Пример.


Результат работы программы:


Теперь совместим сохранение и восстановление из файла на примере списка объектов.




Пример.


Результат работы программы:




Исключение данных из сериализации


По умолчанию сериализуются все переменные объекта.
Но следует учитывать, что статические члены класса принадлежат классу, а не объекту, и сериализации не подлежат. Поэтому поля,
помеченные спецификатором static при десериализации, если в области видимости уже существуют объекты того же типа, получают значение, которое поле имеет на момент десериализации в существующем объекте. В случае отсутствия в области видимости объектов такого типа - получают значение «по умолчанию».
Кроме этого, иногда хотелось бы, чтобы некоторые поля были исключены из сериализации. Это может происходить в тех случаях:

      • Если значения полей вычисляются программно. Например, класс, описывающий заказ в интернет-магазине. Каждый заказ, состоит из списка товаров и итоговой стоимости. Общая стоимость заказа складывается из суммарной стоимости каждого товара и вычисляется программно, как сумма стоимости всех товаров. Поэтому итоговую стоимость хранить нет смысла.

      • Если поля содержат конфиденциальную (в определенном смысле секретную) информацию. Например, пароли в целях безопасности также не сериализуют, чтобы не допускать утечки приватной информации за пределы JVM.

      • Если поля не реализуют интерфейс Serializable. Например, иногда класс содержит поля, являющимися ссылками на объекты других классов, которые не реализуют интерфейс Serializable. Примеры таких полей логгеры, потоки ввода-вывода, объекты, которые хранят соединения с базой данных и прочие служебные классы. Если попытаться сериализовать объект, который содержит несериализуемые поля, возникнет ошибка java.io.NotSerializableException.

      • Если поля не являются частью состояния объекта. Сериализовать следует только поля с информацией о состоянии объекта. Поля, добавленные для отладки или для выполнения какой-то служебной функции, которые не несут информации о состоянии объекта, сериализации не подлежат.

Все поля, которые не должны быть сериализованы помечаются спецификатором transient. Например, исключим из сериализации объекта Person переменную age.


Пример.




Если данное определение класса со словом transient вставить в предыдущий пример, то после работы программы можно получить следующий результат:

После десериализации поле, помеченное спецификатором transient получает значение «по умолчанию», соответствующее его типу. Объектный тип «по умолчанию» инициализируется значением null. Но в данном случае тип поля int, и оно получает значение «по умолчанию» 0.






Достарыңызбен бөлісу:
1   ...   11   12   13   14   15   16   17   18   ...   25




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет