Сериализация и RMI
description
Transcript of Сериализация и RMI
![Page 1: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/1.jpg)
Сериализация и RMI
Java Advanced
![Page 2: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/2.jpg)
Java Advanced / Сериализация и RMI 2Georgiy Korneev
Содержание
СериализацияКонцепции RMIПрименение RMIДополнительные возможности RMIЗаключение
![Page 3: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/3.jpg)
СериализацияЧасть 1
![Page 4: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/4.jpg)
Java Advanced / Сериализация и RMI 4Georgiy Korneev
Сериализация и десериализация
Сериализация – запись объекта в байтовый поток
Десериализация – чтение объекта из байтового потока
Пакет java.io
При сериализации и десериализация используется все данные, которые достижимы из объекта
![Page 5: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/5.jpg)
Java Advanced / Сериализация и RMI 5Georgiy Korneev
Сериализация объектов
Запись объектов Интерфейс ObjectOutput extends DataOutput Класс ObjectOutputStream Метод writeObject(object) Исключение NotSerializableException
![Page 6: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/6.jpg)
Java Advanced / Сериализация и RMI 6Georgiy Korneev
Десериализация объектов
Чтение объектов Интерфейс ObjectInput extends DataInput Класс ObjectInputStream Метод readObject() Исключение
ClassNotFoundException InvalidClassException
![Page 7: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/7.jpg)
Java Advanced / Сериализация и RMI 7Georgiy Korneev
Что можно сериализовать
Автоматически сериализуемые классы Маркерный интерфейс Serializable
Классы, сериализуемые вручную Интерфейс Externalizable extends Serializable
![Page 8: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/8.jpg)
Java Advanced / Сериализация и RMI 8Georgiy Korneev
Автоматическая сериализация
Процесс записи Записывается предок Записываются значения всех полей, не
имеющих модификатора transient
Процесс чтения Выделяется память под объект Считывается предок Считываются значения всех полей , не
имеющих модификатора transient
![Page 9: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/9.jpg)
Java Advanced / Сериализация и RMI 9Georgiy Korneev
Пример 1. Автоматическая сериализация
public class Data implements Serializable {
private List<Integer> data;
...
}
public class Data2 extends Data {
private transient String toStringCache;
...
}
![Page 10: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/10.jpg)
Java Advanced / Сериализация и RMI 10Georgiy Korneev
Сериализация в ручную
Интерфейс ExternalizableМетоды
readExternal(ObjectInput in) – должен прочесть состояние из потока
writeExternal(ObjectOutput out) – должен записать состояние в поток
Процесс чтения Создание конструктором по умолчанию Вызов метода readExternal
![Page 11: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/11.jpg)
Java Advanced / Сериализация и RMI 11Georgiy Korneev
Настраиваемая сериализация
Применяется для обеспечения совместимости
Методы readObject(ObjectInputStream in) – должен
прочесть состояние из потока writeObject(ObjectOutputStream out) – должен
записать состояние в потокПроцесс чтения
Выделение памяти Чтение родителя Вызов метода readObject
![Page 12: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/12.jpg)
Java Advanced / Сериализация и RMI 12Georgiy Korneev
Сериализация с несериализуемым предком
Несериализуемый предок должен иметь конструктор по умолчанию
ObjectOuputStream.defaultWriteObject() – записывает поля текущего класса
ObjectInoutStream.defaultReadObject() – считывает поля текущего класса
![Page 13: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/13.jpg)
Java Advanced / Сериализация и RMI 13Georgiy Korneev
Версии сериализованных классов
Применяется для обеспечения совместимости когда версии сериализованного объекта меняются
Поле private final static long serialVersionUID
Инструмент serialver <имя класса>
![Page 14: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/14.jpg)
Java Advanced / Сериализация и RMI 14Georgiy Korneev
Русная сериализация полей
Константа ObjectStreamField[] serialPersistentFields – сериализуемые поля
ObjectOutputStream.PutField putFields() – поля для записи
writeFields() – записывает поляObjectInputStream.GetField getFields() –
читает поля из потока
![Page 15: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/15.jpg)
Java Advanced / Сериализация и RMI 15Georgiy Korneev
Запись и чтение дескрипторов
Применяется когда сам объект не должен сериализовываться
Методы Object writeReplace() – какой объект записать
вместо этого Object readResolve() – какой объект реально
был записан
Реализуются у разных классов
![Page 16: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/16.jpg)
Концепции RMIЧасть 2
![Page 17: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/17.jpg)
Java Advanced / Сериализация и RMI 17Georgiy Korneev
Remote Method Invocation
Механизм, позволяющий объектом из одной Java-машины вызывать методы другой Java-машины
RMI работает по сетиПакет java.rmi
![Page 18: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/18.jpg)
Java Advanced / Сериализация и RMI 18Georgiy Korneev
Схема взаимодействия
Transport Layer
Remote Reference Layer Remote Reference Layer
Stub Skeleton
Client Server
IInterface IInterface
![Page 19: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/19.jpg)
Java Advanced / Сериализация и RMI 19Georgiy Korneev
Удаленные интерфейсы
Удаленный интерфейс – интерфейс, унаследованный от Remote
Все методы удаленных интерфейсов должны бросать RemoteException
![Page 20: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/20.jpg)
Java Advanced / Сериализация и RMI 20Georgiy Korneev
Передача данных
Объекты, реализующие интерфейс Remote передаются по удаленным ссылкам
Остальные объекты передаются по значению путем сериализации
![Page 21: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/21.jpg)
Java Advanced / Сериализация и RMI 21Georgiy Korneev
Stub и Skeleton
Stub и Skeleton генерируются по удаленному классу
Stub служит для передачи данных по сети. Реализует все удаленные интерфейсы класса и только их
Skeleton служит для приема данных по сети и вызов методов реальтного объекта
![Page 22: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/22.jpg)
Java Advanced / Сериализация и RMI 22Georgiy Korneev
Distributed Garbage Collecting
Удаление объектов, на которых больше не ссылок в распределенной среде
Механизм лизингаИнтерфейс Unreferenced
Метод unreferenced()
![Page 23: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/23.jpg)
Java Advanced / Сериализация и RMI 23Georgiy Korneev
Поиск удаленных объектов (1)
Ссылки на удаленный объекты публикуются в RMI registry
Удаленные объекты ищутся по URL вида rmi://<host>:<port>/<object>, где host:port – местоположение RMI registry object – зарегистрированное имя объекта
![Page 24: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/24.jpg)
Java Advanced / Сериализация и RMI 24Georgiy Korneev
Поиск удаленных объектов (2)
Класс Naming – интерфейс к RMI registryМетоды класса
bind(name, object) – зарегистрировать объект lookup(name) – получить объект по имени unbind(name) – отменить регистрацию объекта rebind(name, object) – зарегистрировать новый
объект
![Page 25: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/25.jpg)
Java Advanced / Сериализация и RMI 25Georgiy Korneev
Прежде чем быть переданными на другую машину объект должен быть экспортирован
Метод UnicastRemoteObject.exportObject(object)
Наследники UnicastRemoteObject экспортируются автоматически
Экспорт объектов
![Page 26: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/26.jpg)
Применение RMIЧасть 3
![Page 27: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/27.jpg)
Java Advanced / Сериализация и RMI 27Georgiy Korneev
Пример: банк
Банк поддерживает счета, идентифицируемые строками
По счету можно Узнать идентификатор Узнать сумму денег на счете Изменить сумму денег на счете
![Page 28: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/28.jpg)
Java Advanced / Сериализация и RMI 28Georgiy Korneev
Удаленный интерфейс банка
public interface Bank extends Remote {
// Создает счет
public Account createAccount(String id)
throws RemoteException;
// Возвращает счет
public Account getAccount(String id)
throws RemoteException;
}
![Page 29: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/29.jpg)
Java Advanced / Сериализация и RMI 29Georgiy Korneev
Удаленный интерфейс счета
public interface Account extends Remote {
// Узнать идентификатор
public String getId()
throws RemoteException;
// Узнать количество денег
public int getAmount()
throws RemoteException;
// Установить количество денег
public void setAmount(int amount)
throws RemoteException;
}
![Page 30: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/30.jpg)
Java Advanced / Сериализация и RMI 30Georgiy Korneev
Реализация счета
Класс AccountImpl implements Accountpublic String getId() {
return id;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
![Page 31: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/31.jpg)
Java Advanced / Сериализация и RMI 31Georgiy Korneev
Реализация банка
Класс BankImpl implements Bankpublic Account createAccount(String id) {
Account account = new AccountImpl(id);
accounts.put(id, account);
return account;
}
public Account getAccount(String id) {
return accounts.get(id);
}
![Page 32: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/32.jpg)
Java Advanced / Сериализация и RMI 32Georgiy Korneev
Сервер
Регистрация банка в RMI registryBank 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");}
![Page 33: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/33.jpg)
Java Advanced / Сериализация и RMI 33Georgiy Korneev
Клиент (1)
Получение ссылки на банкBank bank;
try {
bank = (Bank) Naming.lookup("rmi://localhost/bank");
} catch (NotBoundException e) {
System.out.println("Bank is not bound");
return;
} catch (MalformedURLException e) {
System.out.println("Bank URL is invalid");
return;
}
![Page 34: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/34.jpg)
Java Advanced / Сериализация и RMI 34Georgiy Korneev
Клиент (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");
}
![Page 35: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/35.jpg)
Java Advanced / Сериализация и RMI 35Georgiy Korneev
Клиент (3)
Операции со счетомSystem.out.println("Money: " +
account.getAmount());
System.out.println("Adding money");
account.setAmount(account.getAmount() + 100);
System.out.println("Money: " + account.getAmount());
![Page 36: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/36.jpg)
Java Advanced / Сериализация и RMI 36Georgiy Korneev
Запуск
Создание Stub для классов rmic AccountImpl BankImpl
Запуск RMI Registry rmiregistry
Запуск сервераЗапуск клиента
![Page 37: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/37.jpg)
Дополнительные возможности RMI
Часть 4
![Page 38: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/38.jpg)
Java Advanced / Сериализация и RMI 38Georgiy Korneev
Фабрики сокетов
Класс RMIClientSocketFactory – фабрика клиентских сокетов Метод Socket createSocket(String host, int port)
Класс RMIServerSocketFactory – фабрика серверных сокетов Метод ServerSocket createServerSocket(int port)
Класс RMISocketFactory – фабрика сокетов, применяемая по умолчанию
UnicastRemoteObject.exportObject(object, port, csf, ssf) – экспортирует объект
![Page 39: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/39.jpg)
Java Advanced / Сериализация и RMI 39Georgiy Korneev
Создание Registry на лету
Интерфейс Registry – экземпляр RMI registry
Класс LocateRegistry – позволяет находить и создавать экземпляры RMI registry getRegistry(host?, port?) – найти RMI registry createRegistry(port) – создать экземпляр RMI
registry
![Page 40: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/40.jpg)
Java Advanced / Сериализация и RMI 40Georgiy Korneev
Дополнительные возможности RMI
Использование callback процедурActivation – технология, позволяющая
создавать удаленные объектыЗагрузка .class файлов с HTTP сервера
![Page 41: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/41.jpg)
ЗаключениеЧасть 5
![Page 42: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/42.jpg)
Java Advanced / Сериализация и RMI 42Georgiy Korneev
Ссылки по сериализации
Java Object Serialization Specification // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/serialTOC.html
Object Serialization (Guide) // http://java.sun.com/j2se/1.5.0/docs/guide/serialization/index.html
Serialization (Tutorial) // http://java.sun.com/developer/onlineTraining/Programming/BasicJava2/serial.html
Serialization FAQ // http://java.sun.com/products/jdk/serialization/faq/
![Page 43: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/43.jpg)
Java Advanced / Сериализация и RMI 43Georgiy Korneev
Ссылки по 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/rmi/RMI.html
![Page 44: Сериализация и RMI](https://reader036.fdocuments.us/reader036/viewer/2022062500/56814f95550346895dbd51d2/html5/thumbnails/44.jpg)
Java Advanced / Сериализация и RMI 44Georgiy Korneev
Вопросы