Download Сериализация

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Java Advanced
Сериализация и RMI
Содержание
Сериализация
 Концепции RMI
 Применение RMI
 Заключение

Georgiy Korneev
Java Advanced / Сериализация и RMI
2
Часть 1
Сериализация
Сериализация и десериализация
Сериализация – запись объекта в
байтовый поток
 Десериализация – чтение объекта из
байтового потока
 Пакет java.io


При сериализации и десериализация
используется все данные, которые
достижимы из объекта
Georgiy Korneev
Java Advanced / Сериализация и RMI
4
Десериализация объектов

Чтение объектов




Интерфейс ObjectInput extends DataInput
Класс ObjectInputStream
Метод readObject()
Исключение


Georgiy Korneev
ClassNotFoundException
InvalidClassException
Java Advanced / Сериализация и RMI
5
Сериализация объектов

Запись объектов




Интерфейс ObjectOutput extends DataOutput
Класс ObjectOutputStream
Метод writeObject(object)
Исключение NotSerializableException
Georgiy Korneev
Java Advanced / Сериализация и RMI
6
Что можно сериализовать

Автоматически сериализуемые классы


Маркерный интерфейс Serializable
Классы, сериализуемые в ручную

Интерфейс Externalizable
Georgiy Korneev
Java Advanced / Сериализация и RMI
7
Автоматическая сериализация

Процесс записи



Записывается предок
Записываются значения всех полей, не
имеющих модификатора transient
Процесс чтения



Выделяется память под объект
Считывается предок
Считываются значения всех полей , не
имеющих модификатора transient
Georgiy Korneev
Java Advanced / Сериализация и RMI
8
Сериализация в ручную


Интерфейс Externalizable
Методы



readExternal(ObjectInput in) – должен прочесть
состояние из потока
writeExternal(ObjectOutput out) – должен
записать состояние в поток
Процесс чтения


Создание конструктором по умолчанию
Вызов метода readExternal
Georgiy Korneev
Java Advanced / Сериализация и RMI
9
Настраиваемая сериализация


Применяется для обеспечения
совместимости
Методы



readObject(ObjectInputStream in) – должен
прочесть состояние из потока
writeObject(ObjectOutputStream out) – должен
записать состояние в поток
Процесс чтения



Выделение памяти
Чтение родителя
Вызов метода readObject
Georgiy Korneev
Java Advanced / Сериализация и RMI
10
Запись и чтение дескрипторов
Применяется когда сам объект не должен
сериализовываться
 Методы




Object writeReplace() – какой объект записать
вместо этого
Object readResolve() – какой объект реально
был записан
Реализуются у разных классов
Georgiy Korneev
Java Advanced / Сериализация и RMI
11
Версии сериализованных классов


Применяется для обеспечения
совместимости когда версии
сериализованного объекта меняются
Поле


private final static long serialVersionUID
Инструмент

serialver <имя класса>
Georgiy Korneev
Java Advanced / Сериализация и RMI
12
Часть 2
Концепции RMI
Remote Method Invocation



Механизм, позволяющий объектом из
одной Java-машины вызывать методы
другой Java-машины
RMI работает по сети
Пакет java.rmi
Georgiy Korneev
Java Advanced / Сериализация и RMI
14
Схема взаимодействия
Client
Server
IInterface
IInterface
Stub
Skeleton
Remote Reference Layer
Remote Reference Layer
Transport Layer
Georgiy Korneev
Java Advanced / Сериализация и RMI
15
Удаленные интерфейсы
Удаленный интерфейс – интерфейс,
унаследованный от Remote
 Все методы удаленных интерфейсов
должны бросать RemoteException

Georgiy Korneev
Java Advanced / Сериализация и RMI
16
Передача данных


Объекты, реализующие интерфейс
Remote передаются по удаленным
ссылкам
Остальные объекты передаются по
значению путем сериализации
Georgiy Korneev
Java Advanced / Сериализация и RMI
17
Stub и Skeleton
Stub и Skeleton генерируются по
удаленному классу
 Stub служит для передачи данных по сети.
Реализует все удаленные интерфейсы
класса и только их
 Skeleton служит для приема данных по
сети и вызов методов реальтного объекта

Georgiy Korneev
Java Advanced / Сериализация и RMI
18
Distributed Garbage Collecting
Удаление объектов, на которых больше не
ссылок в распределенной среде
 Механизм лизинга
 Интерфейс Unreferenced


Метод unreferenced()
Georgiy Korneev
Java Advanced / Сериализация и RMI
19
Поиск удаленных объектов
Ссылки на удаленный объекты
публикуются в RMI registry
 Удаленные объекты ищутся по URL вида
rmi://<host>:<port>/<object>, где



host:port – местоположение RMI registry
object – зарегистрированное имя объекта
Georgiy Korneev
Java Advanced / Сериализация и RMI
20
Экспорт объектов


Прежде чем быть переданными на другую
машину объект должен быть
экспортирован
Метод


UnicastRemoteObject.exportObject(object)
Наследники UnicastRemoteObject
экспортируются автоматически
Georgiy Korneev
Java Advanced / Сериализация и RMI
21
Часть 3
Применение RMI
Пример: банк
Банк поддерживает счета,
идентифицируемые строками
 По счету можно




Узнать идентификатор
Узнать сумму денег на счете
Изменить сумму денег на счете
Georgiy Korneev
Java Advanced / Сериализация и RMI
23
Удаленный интерфейс банка
public interface Bank extends Remote {
// Создает счет
public Account createAccount(String id)
throws RemoteException;
// Возвращает счет
public Account getAccount(String id)
throws RemoteException;
}
Georgiy Korneev
Java Advanced / Сериализация и RMI
24
Удаленный интерфейс счета
public interface Account extends Remote {
// Узнать идентификатор
public String getId()
throws RemoteException;
// Узнать количество денег
public int getAmount()
throws RemoteException;
// Установить количество денег
public void setAmount(int amount)
throws RemoteException;
}
Georgiy Korneev
Java Advanced / Сериализация и RMI
25
Реализация счета

Класс AccountImpl implements Account
public String getId() {
return id;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
Georgiy Korneev
Java Advanced / Сериализация и RMI
26
Реализация банка

Класс BankImpl implements Bank
public Account createAccount(String id) {
Account account = new AccountImpl(id);
accounts.put(id, account);
return account;
}
public Account getAccount(String id) {
return accounts.get(id);
}
Georgiy Korneev
Java Advanced / Сериализация и RMI
27
Сервер

Регистрация банка в RMI registry
Bank bank = new BankImpl();
try {
UnicastRemoteObject.exportObject(bank);
Naming.rebind("rmi://localhost/bank", bank);
} catch (RemoteException e) {
System.out.println("Cannot export object: " +
e.getMessage());
e.printStackTrace();
} catch (MalformedURLException e) {
System.out.println("Malformed URL");
}
Georgiy Korneev
Java Advanced / Сериализация и RMI
28
Клиент (1)

Получение ссылки на банк
Bank bank;
try {
bank = (Bank)
Naming.lookup("rmi://localhost/bank");
} catch (NotBoundException e) {
System.out.println("Bank URL is invalid");
return;
} catch (MalformedURLException e) {
System.out.println("Bank is not bound");
return;
}
Georgiy Korneev
Java Advanced / Сериализация и RMI
29
Клиент (2)

Создание счета
Account account = bank.getAccount("geo");
if (account == null) {
System.out.println("Creating account");
account = bank.createAccount("geo");
} else {
System.out.println("Account already exists");
}
Georgiy Korneev
Java Advanced / Сериализация и RMI
30
Клиент (3)

Операции со счетом
System.out.println("Money: " +
account.getAmount());
System.out.println("Adding money");
account.setAmount(account.getAmount() + 100);
System.out.println("Money: " +
account.getAmount());
Georgiy Korneev
Java Advanced / Сериализация и RMI
31
Запуск

Создание Stub для классов


rmic AccountImpl BankImpl
Запуск RMI Registry

rmiregistry
Запуск сервера
 Запуск клиента

Georgiy Korneev
Java Advanced / Сериализация и RMI
32
Дополнительные возможности RMI



Использование callback процедур
Activation – технология, позволяющая
создавать удаленные объекты
Загрузка .class файлов с HTTP сервера
Georgiy Korneev
Java Advanced / Сериализация и RMI
33
Часть 4
Заключение
Ссылки по сериализации

Java Object Serialization Specification //
http://java.sun.com/j2se/1.5.0/docs/guide/seri
alization/spec/serialTOC.html
 Object Serialization (Guide) //
http://java.sun.com/j2se/1.5.0/docs/guide/seri
alization/index.html
 Serialization (Tutorial) //
http://java.sun.com/developer/onlineTraining/
Programming/BasicJava2/serial.html
 Serialization FAQ //
http://java.sun.com/products/jdk/serialization/f
aq/
Georgiy Korneev
Java Advanced / Сериализация и RMI
35
Ссылки по RMI

RMI (Guide & tutotials)
http://java.sun.com/j2se/1.5.0/docs/guide/rmi/
 Java RMI Specification //
http://java.sun.com/j2se/1.5.0/docs/guide/rmi/
spec/rmiTOC.html
 RMI Tutorial //
http://java.sun.com/developer/onlineTraining/r
mi/RMI.html
Georgiy Korneev
Java Advanced / Сериализация и RMI
36
Вопросы
Georgiy Korneev
Java Advanced / Сериализация и RMI
37