Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
java1_2013_2014 / java8.pptx
Скачиваний:
133
Добавлен:
16.04.2015
Размер:
140.74 Кб
Скачать

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

Соседние файлы в папке java1_2013_2014