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

116

Students pr2 = (Students) oi.readObject();

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

System.out.println(pr2.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.9.

Рис. 4.9 – Пример сериализации при наследовании

4.2.7 Сериализация Java с агрегированием

Если у класса есть ссылка на другой класс, все ссылки должны быть сериализуемыми, иначе процесс сериализации не будет выполнен. В таком случае во время выполнения выбрасывается NotSerializableException.

import java.io.Serializable; //простой класс

class Address{ String city;

117

public Address(String city) { this.city=city;

}

}

//сериализуемый класс

class Students implements Serializable{ Address address;//HAS-A

String faculty; int age;

String name; //конструктор

public Students(String city,String nameOfFaculty, String name, int age)

{

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

this.faculty = nameOfFaculty;

}

@Override

public String toString() {

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

}

}

Далее сериализуем/десериализуем объекты класса Students:

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) { //создание объектов p1 и p2

Students p1 = new Students("Томск","ФДО","Иванов", 18); Students p2 = new Students("Северск","ФСУ","Петров", 22);

try {

//запись объектов в файл с помощью ObjectOut-putStream

118

FileOutputStream f = new FileOutputStream(new File("my-

Objects.txt"));

ObjectOutputStream o = new ObjectOutputStream(f);

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

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

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

Objects.txt"));

ObjectInputStream oi = new ObjectInputStream(fi);

//Чтение объектов из файла myObjects.txt Students pr1 = (Students) oi.readObject(); Students pr2 = (Students) oi.readObject();

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

System.out.println(pr2.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();

}

}

}

Как видим, поле address, несмотря на инициализацию, осталось со значением null (рис. 4.10).

119

Рис. 4.10 – Сериализация при агрегации объектов

Поскольку Address не сериализуемый, мы не можем сериализовать объ-

екты класса Students.

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

Все объекты внутри объекта должны быть сериализуемыми.

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

4.2.8 SerialVersionUID

Процесс сериализации во время выполнения связывает идентификатор с

каждым классом Serializable, который известен как SerialVersionUID.

Он используется для проверки отправителя и получателя сериализованного объ-

екта. Отправитель и получатель должны быть одинаковыми. Отправитель и по-

лучатель должны иметь одинаковый SerialVersionUID, в противном случае

при десериализации объекта будет создано исключение InvalidClassException.

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

SerialVersionUID – элемент управления версиями в классе

Serializable.

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

Если вы явно не объявите serialVersionUID, JVM сделает это за вас

автоматически, основываясь на различных аспектах вашего класса Seriali-

zable, как описано в «Спецификация сериализации объектов Java» [11].

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

IDE сообщит об отсутствии SerialVersionUID, например:

The Serializable class Customer does not declare a static final SerialVer-

120

sionUID field of type long (Serializable-класс Customer не объявил статическое финальное поле SerialVersionUID типа long).

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

SerialVersionUID должен быть типа long с модификаторами static и final. Предлагается явно объявить поле serialVersionUID в классе, а также сделать его закрытым. Например, добавим в класс Students:

private static final long serialVersionUID=1L;

Далее сериализуем/десериализуем объекты:

public class Main {

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

Students p1 = new Students("ФДО","Иванов", 18); Students p2 = new Students("ФСУ","Петров", 22);

try {

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

Objects.txt"));

ObjectOutputStream o = new ObjectOutputStream(f);

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

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

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

Objects.txt"));

ObjectInputStream oi = new ObjectInputStream(fi);

//Чтение объектов из файла myObjects.txt Students pr1 = (Students) oi.readObject(); Students pr2 = (Students) oi.readObject();

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

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

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

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

}catch (IOException e) {