
- •JAVA-ТЕХНОЛОГИЯ
- •Сериализация (serialization)
- •Принципы сериализации в Java
- •Базовый API для сериализации (java.io.*)
- •Десериализация (java.io.*)
- •Пример (слайд 1/3)
- •Пример (слайд 2/3)
- •Пример (слайд 3/3)
- •Пояснения к примеру
- •Дополнительные возможности
- •Другой способ описания сериализуемых полей
- •Формат (протокол) сериализации
- •Java Beans
- •Сравнение с другими компонентными моделями
- •Базовый инструментарий разработки JavaBeans
- •Основные принципы разработки Java Beans
- •Архивация Java beans (и других java- приложений): утилита jar
- •Пример Java bean: слайд 1 / 3 (конструктор)
- •Пример Java bean: слайд 2 / 3 (свойство “Red”)
- •Пример Java bean: слайд 3 / 3 (графика)
- •Пояснения к примеру Java bean
- •Компиляция, архивация и исполнение в BeanBox

JAVA-ТЕХНОЛОГИЯ
Сафонов Владимир Олегович
Профессор кафедры информатики, руководитель лаборатории Java- технологии (http://polyhimnie.math.spbu.ru/jtl)
Email: vosafonov@gmail.com
Лекция 8

Сериализация (serialization)
Cемь основных свойств объектно-ориентированной модели
(Grady Booch, “Object Oriented Analysis and Design”) :
абстракция (abstraction)
инкапсуляция (encapsulation)
модульность (modularity)
иерархия (hierarchy)
типизация (typing)
параллелизм (concurrency) ; в Java - многопоточность
сохраняемость (persistence) – возможность сохранять
иерархию объектов во внешней памяти; в Java -
сериализация
Java - первый объектно-ориентированный язык,
(C)поддерживающийВ.О. Сафонов. все семь этих свойств.
2013

Принципы сериализации в Java
Сериализация – это API для преобразования объектов в поток байтов и обратно (десериализация), т.е. поддержка возможности хранения объектов во внешней памяти
Реализована как набор интерфейсов и классов пакета java.io
При сериализации в байтовый поток преобразуется весь граф взаимосвязанных между собой объектов (начиная с того, который является аргументом вызова метода writeObject), со всеми их возможными взаимными и циклическими ссылками
В байтовом потоке кодируется информация о типах (классах) и значениях объектов; transient-поля не сериализуются
Для того, чтобы объект класса C можно было сериализовать, достаточно, чтобы C реализовывал интерфейс java.io.Serializable:
public class C implements Serializable { … } Serializable – интерфейс-маркер (пустой)
Для сравнения, в .NET сериализуемый класс помечается
встроенным атрибутом Serializable:
[ Serializable ] public class C …
(C) В.О. Сафонов. 2013

Базовый API для сериализации (java.io.*)
public interface Serializable { } – должен реализовываться всеми теми классами, которые подлежат сериализации
FileOutputStream – класс для записи байтового потока (объектов) в файл:
FileOutputStream fs = new FileOutputStream(“file.ser”);
//создание и открытие файлового потока fs.close(); - закрытие файлового потока
ObjectOutputStream – класс для вывода объектов в поток: ObjectOutputStream os = new ObjectOutputStream(fs);
//открытие потока для вывода (сериализации) объектов os.writeObject(myobject);
//запись (сериализация) объекта класса MyClass os.flush(); // сброс буферов в поток
os.close(); // закрытие потока fs.close(); // закрытие файла
Все методы могут бросать IOException (try-блок обязателен)
(C) В.О. Сафонов. 2013

Десериализация (java.io.*)
FileInputStream – класс для чтение байтового потока (объектов) из файла:
FileInputStream fs = new FileInputStream(“file.ser”); // открытие
ObjectInputStream – класс для ввода объектов из
потока:
ObjectInputStream os = new ObjectInputStream(fs); // открытие
MyClass p = (MyClass) os.readObject(); //
десериализация
// ClassCastException, если класс объекта указан неверно
(C) В.Оos. Сафонов.close();. // закрытие потока объектов
2013 fs.close(); // закрытие файла

Пример (слайд 1/3)
import java.io.*;
public class MySer implements Serializable { int i;
/* transient */ double d; String s;
public MySer(int i, double d, String s)
{
this.i = i; this.d = d; this.s = s;
}
public String toString()
{
return("MySer object: i=" + i + " d=" + d + " s=" +s);
}
} // MySer
(C) В.О. Сафонов. 2013

Пример (слайд 2/3)
import java.io.*;
public class SerExample {
public static void main(String[] args) { try { // serialization
FileOutputStream fs = new FileOutputStream("my.ser"); ObjectOutputStream os = new ObjectOutputStream(fs); MySer p = new MySer(1, 2.0, "three"); os.writeObject(p);
os.flush();
os.close();
fs.close();
} catch (Exception e) {
System.out.println("Exception in serialization:"+e);
}
(C) В.О. Сафонов. 2013

Пример (слайд 3/3)
try { // deserialization
FileInputStream fs = new FileInputStream("my.ser"); ObjectInputStream os = new ObjectInputStream(fs); MySer q = (MySer) os.readObject();
os.close();
fs.close(); System.out.println("Deserialized object:"); System.out.println(q);
} catch (Exception e) {
System.out.println("Exception in deserialization: " + e);
}
}
} // SerExample
(C) В.О. Сафонов. 2013

Пояснения к примеру
MySer.java – определение сериализуемого класса
SerExample – использование сериализуемого класса
Вывод примера SerExample:
MySer object: i=1 d=2.0 s=threeЕсли поле
double d; определить как:
transient double d;
то вывод изменится следующим образом:
MySer object: i=1 d=0.0 s=three так как поле d не сериализуется
(C) В.О. Сафонов. 2013

Дополнительные возможности
Класс ObjectOutputStream (реализация интерфейса ObjectOutput): s.write(int aByte); s.write(aByteArray); s.write(aByteArray, off,len); s.writeInt(anInteger); s.writeLong(aLong); s.WriteChar(aChar); s.writeFloat(aFloat); s.writeDouble(aDouble); s.writeBytes(aString);
-различные варианты записи значений
Класс ObjectInputStream (реализация интерфейса ObjectInput) : totalNBytes = s.isAvailable(); - общее число доступных байтов byte b = s.read(); int i = s.readInt(); long l = s.readLong(); ...
-и.т.д. для boolean, char, float, double, … - чтение значений
Интерфейс Externalizable – возможность определения собственной системы сериализации: необходимо реализовать методы readExternal(objectStream) и writeExternal(objectStream),
ивместо стандартной сериализации будут работать они
Методы writeReplace() и readResolve() (не обязательные) позволяют подменить объекты при сериализации и десериализации
Поля, содержащие конфиденциальную информацию, сериализовывать не рекомендуется (их следует специфицировать как private transient)
(C)В.О. Сафонов.
2013