Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум по объектно-ориентированному программированию..pdf
Скачиваний:
16
Добавлен:
05.02.2023
Размер:
3.39 Mб
Скачать

107

Рис. 4.4 – Результат сериализации и десериализации объектов

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

По умолчанию сериализуются все переменные объекта. Однако, возможно,

мы хотим, чтобы некоторые поля были исключены из сериализации. Для этого

они должны быть объявлены с модификатором transient.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

transient («временный, переходный») – это модификатор

для поля класса. При восстановлении объекта у него будет это поле,

но со значением null (0, false).

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Например, исключим поле age из нашего примера:

import java.io.Serializable; //сериализуем класс

class Students implements Serializable{ transient int age;

String name;

//конструкторы

Students() { };

public Students(String name,int age) {

108

this.age= age; this.name = name;

}

@Override

public String toString() {

return "ФИО:" + name + "\nВозраст: " + age;

}

}

В результате, если мы десериализуем объекты, мы получили значения для поля age по умолчанию для transient-переменной, поскольку значение возраста не было сериализовано (рис. 4.5). Оно всегда будет возвращать значение по умолчанию. В таком случае он вернет 0, потому что тип данных age является целым числом.

Рис. 4.5 – Десериализация поля transient-переменной

4.2.4 Сериализация статических полей

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

Укажем в нашем примере поле faculty как статическое.

import java.io.Serializable; //сериализуем класс

109

class Students implements Serializable{ int age;

String name;

static String faculty;

//конструкторы

Students() { };

public Students(String nameOfFaculty, String name,int age) { faculty = nameOfFaculty;

this.age= age; this.name = name;

}

@Override

public String toString() {

return "\nФакультет " + faculty +"\nФИО:" + name + "\nВозраст: " +

age;

}

}

Далее:

import java.io.File;

import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;

import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class Main {

public static void main(String[] args) { //создание объекта p

Students p = new Students("ФСУ","Иванов", 18);

try {

//запись объектов в файл с помощью ObjectOut-putStream FileOutputStream f = new FileOutputStream(new File("my-

Objects.txt"));

ObjectOutputStream o = new ObjectOutputStream(f); //Запись объектов в файл myObjects.txt o.writeObject(p);

o.close();

110

f.close();

//Чтение объектов с помощью ObjectInputStream FileInputStream fi = new FileInputStream(new File("my-

Objects.txt"));

ObjectInputStream oi = new ObjectInputStream(fi);

Students.faculty = "ФДО";//изменение значения static-поля //Чтение объектов из файла myObjects.txt Students pr = (Students) oi.readObject();

System.out.println(pr.toString());

oi.close(); fi.close();

}catch (FileNotFoundException e) { System.out.println("File not found");

}catch (IOException e) {

System.out.println("Error initializing stream"); } catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

}

Вывод этой программы будет следующий (рис. 4.6).

Рис. 4.6 – Сериализация статического поля

Поле faculty, помеченное как статическое, получает то значение, которое имеет это поле на текущий момент, т. е. при создании объекта p поле получило значение «ФСУ», а затем значение статического поля было изменено на «ФДО». Если же объекта данного типа нет в области видимости, то статическое поле также получает значение по умолчанию. Поэтому после десериализации на консоли мы увидели значение «ФДО».

111

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Во время десериализации статическое значение переменной

будет загружено из класса, т. е. получает значение по умолчанию в

случае отсутствия в области видимости объектов своего типа, а при

их наличии получает значение, которое определено для существую-

щего объекта. Но любая статическая переменная, которая предостав-

ляется при инициализации класса, сериализуется.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Если нужно сериализовать статические поля, мы должны делать это вруч-

ную. Добавим два метода для сериализации/десериализации статического поля

faculty:

public static void serializeStatic(ObjectOutputStream oos) throws IOException{

oos.writeUTF(faculty);

}

public static void deserializeStatic(ObjectInputStream ois) throws IOException{ faculty=ois.readUTF();

}

Далее вызовем эти методы:

public class Main {

public static void main(String[] args) { //создание объекта p

Students p = new Students("ФСУ","Иванов", 18);

try {

//запись объектов в файл с помощью ObjectOut-putStream FileOutputStream f = new FileOutputStream(new File("my-

Objects.txt"));

ObjectOutputStream o = new ObjectOutputStream(f);

//Запись объектов в файл myObjects.txt Students.serializeStatic(o); o.writeObject(p);

o.close(); f.close();

//Чтение объектов с помощью ObjectInputStream FileInputStream fi = new FileInputStream(new File("my-

Objects.txt"));

ObjectInputStream oi = new ObjectInputStream(fi); Students.faculty = "ФДО";//изменение значения static-поля