Сериализация
Download
Report
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