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

112

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

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.7).

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

Как видите, теперь все в порядке. Мы просто добавили и вызвали два статических метода: для сериализации и десериализации статической переменной. Также можно управлять сериализацией в ручном режиме, где это требуется.

4.2.5Сериализация с массивом или коллекцией

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

Создадим список наших студентов:

import java.io.File;

import java.io.FileInputStream;

113

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

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

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

ArrayList<Students> people = new ArrayList<Students>(); people.add(new Students("ФСУ","Иванов", 18)); people.add(new Students("ФДО","Петров", 22)); people.add(new Students("ФСУ","Сидоров", 20));

try {

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

Objects.txt"));

ObjectOutputStream o = new ObjectOutputStream(f);

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

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

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

Objects.txt"));

ObjectInputStream oi = new ObjectInputStream(fi);

//Чтение объектов из файла myObjects.txt

//десериализация в новый список

ArrayList<Students> newPeople= new ArrayList<Stu-

dents>();

newPeople=((ArrayList<Students>)oi.readObject());

for(Students p : newPeople) System.out.printf(p.toString());

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

} catch (FileNotFoundException e) {

114

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

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

e.printStackTrace();

}

}

}

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

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

4.2.6 Сериализация Java с наследованием

Если класс реализует сериализуемый интерфейс, тогда все его подклассы также будут сериализуемыми. Давайте посмотрим на пример, приведенный ниже:

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

class Person implements Serializable{ int age;

String name;

Person(String name, int age) { this.age = age; this.name = name;

}

}

//класс-наследник

class Students extends Person{

115

String faculty;

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

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

this.faculty = nameOfFaculty;

}

@Override

public String toString() {

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

}

}

Теперь вы можете сериализовать объект класса Students, который расширяет класс Person, который является сериализуемым. Свойства родительского класса наследуются подклассами, поэтому, если родительский класс является Serializable, подкласс также будет сериализуемым.

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();