Изучение механизма сериализации в Java

Цель занятия

Целью практического занятия является изучение работы механизма сериализации объектов в языке Java. Необходимо научиться сохранять на форме простые объекты (не контейнеры), а также массивы однотипных объектов. Кроме этого, требуется восстанавливать записанные в файле на диске объекты и их функциональность. Рекомендуемаялитература[15, 17].

Краткие теоретические сведения

Сериализация — это запись и чтение экземпляров классов в поток ввода-вывода. Мы знаем, что можно сохранять и читать из файлов простые типы данных: числа, строки, символы, логические переменные. Современные объектно-ориентированные языки позволяют сохранять и читать объекты. Далее будем под сериализацией понимать сохранение объектов, а под десериализацией — их чтение из файлов.

Следующий фрагмент программы демонстрирует выполнение сериализации:

if (evt.target==b_serialize)

{

try

{

fos= new FileOutputStream("tmpserial"); oos=new ObjectOutputStream(fos); oos.writeObject(bexit); // Запись в файл кнопки oos.writeObject(b_serialize) ; oos.writeObject(b_deserialize);

oos.writeObject(tf);// Запись в файл текстовго поля fos.close(); return true;

}

catch(Exception err)

{System.out.println("Error:"+err) ; }

Как видим, для сохранения объектов в файле используется метод writeObject (). Этот метод принадлежит классу objectout- putstream. Процедура сериализации привязана к кнопке. В программной реализации создается главное окно с тремя кнопками и текстовым полем, которые подлежат сериализации. Запомним, что сериализовать можно только простые объекты, не содержащие других объектов! Контейнеры, включая формы и панели, сериализовать нельзя. Переменные fos, oos объявлены как потоковые переменные в главном классе. Эти объявления таковы:

public class labl4 extends Frame {

ObjectOutputStream oos;

FileOutputStream fos;

ObjectInputStream ois;

FileInputStream fis;

static labl4 form;

Button bexit=new Button("Exit");

Button b_serialize=new Button("Serial"); // Кнопка для сериализации

Button b_deserialize=new Button("Deserialize"); // Кнопка для

// десериализации

TextField tf=new TextField("100");

Labl4(String s)

{ //конструктор super(s); setLayout(null); add(bexit); add(b_serialize) ; add(b_deserialize) ; add (tf) ;

setBackground(new Color(100,20,150)); bexit.setBounds(10,20, 60,20) ; b_serialize.setBounds(10,4 0,100,20); b_deserialize.setBounds(10, 60,100,20); tf.setBounds(10,100,200,20) ;

}

public boolean action(Event evt, Object ob)

{

if (evt.target==bexit)

{

System.exit(0) ; return true;

}

else

if (evt.target==b_deserialize)

Исходная форма отображается на экране так, как показано на рис. 2.20.

Рис. 2.20. Окно исходной и десериализованной формы

Основное окно на рис. 2.20 показано слева. Справа размещается восстановленное (десериализованное) окно. Кнопка сериализации запрограммирована следующим образом:

if (evt.target==b_serialize) try {

fos= new FileOutputStream("tmpserial"); // Создаем файл

// для хранения // сериализованных

объектов

oos=new ObjectOutputStream(fos);

oos.writeObject(bexit); //Сохраняем кнопку bexit oos.writeObject(b_serialize); // Сохраняемкнопку

// b serialize

oos.writeObject(b_deserialize); // Сохраняемкнопку

// b_deserialize

oos.writeObject(tf);//CoxpaHHeM текстовое поле fos.close(); return true;

}

catch(Exception err)

{System.out.println("Error:"+err) ; }

}

}

По нажатию кнопки десериализации создается новое окноформа и в нем отображаются считываемые (десериализуемые) объекты. Чтение объектов из файла реализует команда

readObj ect().

При чтении необходимо выполнять приведение типов. Запомните, что после восстановления из файла десериализованный объект не содержит методов, которыми он обладал до сохранения. Таким образом, все методы десериализованных объектов должны быть прописаны в классе-окне, где они восстанавливаются. В примре таким классом является dig. Обратим внимание на то, что после создания десериализованной формы с кнопками и текстовым полем основной формы может быть проведена сериализация этой второй формы и получена третья десериализованная форма и т. д. Однако вся информация об объектах записывается в один и тот же файл. Заметим также, что описание класса dig практически копирует описание основного класса iabl4. Приводим описание класса dig:

class dlg extends Frame {

FileInputStream fis;

FileOutputStream fos;

ObjectInputStream ois;

ObjectOutputStream oos;

Button bexitD;

Button b_serializeD;

Button b deserializeD;

TextField tfD; dlg()

setBackground(new Color(180,100,150)); setLayout(null) ; resize (400, 500) ; move(50,100);

public boolean action(Event evt, Object ob) if (evt.target==bexitD)

{

this.dispose(); return true;

}

else

if (evt.target==b_deserializeD)

{

И Т. Д.

Теперь приведем полный текст приложения (листинг 2.29).

: Листинг 2.29. Приложение для сериализации/десериализации | объектов

import java.awt.*; import java.util.*; import java.io.*; class dlg extends Frame

{ // Класс на основе формы для десериализации FileInputStream fis; // Объявление файловой переменной для // чтения

FileOutputStream fos; // Объявление файловой переменной для

// записи

ObjectInputStream ois; // ois используется для чтения

// объектов

ObjectOutputStream oos; // oos используется для записи объектов

Button bexitD; // Кнопка для выхода Button b_serializeD; // Кнопка для сериадизации Button b_deserializeD; // Кнопка для десериализации TextField tfD; // Текстовое поле dlg() // Конструктор десериализуемой формы {

setBackground(new Color(180,100,150)); setLayout(null); resize (400, 500) ; move(50,100);

}

public boolean action(Event evt, Object ob)

{

if (evt.target==bexitD)

{

this.dispose(); return true;

}

else

if (evt.target==b_deserializeD)

{

File fl=new File("tmpserial"); // Выполняется

// десериализация // из файла tmpserial if (fl.exists()) // Проверяем, существует ли этот файл {

tfD.setText("FileExists"); dlg dd= new dlg(); // Создаем новую форму try {

fis= new FileInputStream("tmpserial");

ois=new ObjectInputStream(fis);

dd.bexitD= (Button) ois.readObject(); // Читаемиз

// файла кнопку // и выполняем // приведение типа dd.bexitD.setBounds(10,30,100,20); // Устанавливаем

// ее размеры // и координаты dd.add(dd.bexitD); // Добавляем кнопку на форму dd.b_serializeD=(Button) ois.readObject(); // Те же

// действия выполняем // со второй кнопкой dd.b_serializeD.setBounds(10,50,100,20); dd.add(dd.b_serializeD);

dd.b_deserializeD=(Button) ois.readObject(); dd.b_deserializeD.setBounds(10,70,100, 20); dd.add(dd.b_deserializeD) ;

dd.tfD=(TextField) ois.readObject(); // Читаемиз // файла текстовое поле и выполняем приведение типа dd.tfD.setBounds(10, 90,100, 20); dd.add(dd.tfD);

dd.show(); // Отображаем десериализованную форму fis.close(); return true;

}

catch(Exception err)

{System.out.println("Error:"+err);}

}

else

{tfD.setText("FileNotExists");} return true;

}

else

if (evt.target==b_serializeD) // Кнопка для сериализации

try

{

fos= new FileOutputStream("tmpserial"); // Создаем

// файл для // сериализации oos=new ObjectOutputStream(fos); // Создаем потоковую

// переменную // для записи в файл // объектов

oos.writeObject(bexitD); // Пишем в файл кнопки и

// текстовое поле oos.writeObject(b_serializeD); oos.writeObject(b_deserializeD); oos.writeObject(tfD) ; fos.close(); return true;

}

catch(Exception err)

{System.out.println("Error:"+err);}

}

return false;

}

}

public class labl4 extends Frame { // Форма основного класса

ObjectOutputStream oos; // Объектная переменная для записи

// объектов в файл FileOutputStream fos; // Переменная для чтения объектов из

// файла

ObjectInputStream ois;

FileInputStream fis; static labl4 form;

Button bexit=new Button("Exit"); // Кнопка для выхода

Button b_serialize=new Button("Serial"); // Кнопка для

// сериализации

Button b_deserialize=new Button("Deserialize"); // Кнопка для

// десериализации

TextField tf=new TextField("100"); labl4(String s)

{ //Конструктор основной формы super(s); setLayout(null); add(bexit); add(b_serialize); add(b_deserialize); add (tf) ;

setBackground(new Color(100,20,150)); bexit.setBounds(10,20, 60,20) ; b_serialize.setBounds(10,4 0,100,20); b_deserialize.setBounds(10, 60,100,20); tf.setBounds(10,100,200,20) ;

}

public boolean action(Event evt, Object ob) // Обработчик

// событий

{

if (evt.target==bexit) // Выход из приложения {

System.exit(0); return true;

}

else

if (evt.target==b_deserialize) // Запуск десериализации {

File fl=new File("tmpserial"); // Проверяем, есть ли

// файл с записанными // объектами

if (fl.exists())

{

tf.setText("FileExists") ;

dlg d= new dlg () ; / / Создаем новую форму на базе класса // dlg

try

{

fis= new FileInputStream("tmpserial"); // Создание // потоковой переменной для низкоуровневого ввода ois=new ObjectInputStream(fis); // Создание потоковой // переменной для высокоуровневого ввода d.bexitD= (Button) ois.readObject(); // Читаемна // новую форму объекты. При чтении выполняем // приведение типа d.bexitD.setBounds(10,30,100,20); d.add(d.bexitD);

d.b_serializeD=(Button) ois.readObject(); d.b_serializeD.setBounds(10, 50,100, 20); d.add(d.b_serializeD);

d.b_deserializeD=(Button) ois.readObject(); d.b_deserializeD.setBounds(10, 70,100, 20); d.add(d.b_deserializeD); d.tfD=(TextField) ois.readObject(); d.tfD.setBounds(10, 90,100, 20); d.add(d.tfD);

d. show () ; / / Отображаем новую форму fis.close(); // Закрываем поток для ввода return true;

}

catch(Exception err)

{System.out.println("Error:"+err) ; }

}

else

{tf.setText("FileNotExists");}

return true;

}

else

if (evt.target==b_serialize) // Активизировано событие сериализации {

try

{

fos= new FileOutputStream("tmpserial");

oos=new ObjectOutputStream(fos); // Запись в файл

// кнопок

// и текстового поля

oos.writeObject(bexit); oos.writeObject(b_serialize); oos.writeObject(b_deserialize); oos.writeObject(tf) ; fos.close(); return true;

}

catch(Exception err)

{System.out.println("Error:"+err);}

}

return false;

}

public static void main(String[] args)

{

form = new labl4("Serialization"); form.resize(400, 400); form.move(200,100) ; form.show();

Источник: Герман О. B., Герман Ю. О., Программирование на Java и C# для студента. — СПб.: БХВ-Петербург, 2005. — 512 c.: ил.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100