Сериализация и RMI Java Advanced
2Georgiy KorneevJava Advanced / Сериализация и RMI Содержание Сериализация Концепции RMI Применение RMI Заключение
Сериализация Часть 1
4Georgiy KorneevJava Advanced / Сериализация и RMI Сериализация и десериализация Сериализация – запись объекта в байтовый поток Десериализация – чтение объекта из байтового потока Пакет java.io При сериализации и десериализация используется все данные, которые достижимы из объекта
5Georgiy KorneevJava Advanced / Сериализация и RMI Десериализация объектов Чтение объектов Интерфейс ObjectInput extends DataInput Класс ObjectInputStream Метод readObject() Исключение ClassNotFoundException InvalidClassException
6Georgiy KorneevJava Advanced / Сериализация и RMI Сериализация объектов Запись объектов Интерфейс ObjectOutput extends DataOutput Класс ObjectOutputStream Метод writeObject(object) Исключение NotSerializableException
7Georgiy KorneevJava Advanced / Сериализация и RMI Что можно сериализовать Автоматически сериализуемые классы Маркерный интерфейс Serializable Классы, сериализуемые в ручную Интерфейс Externalizable
8Georgiy KorneevJava Advanced / Сериализация и RMI Автоматическая сериализация Процесс записи Записывается предок Записываются значения всех полей, не имеющих модификатора transient Процесс чтения Выделяется память под объект Считывается предок Считываются значения всех полей, не имеющих модификатора transient
9Georgiy KorneevJava Advanced / Сериализация и RMI Сериализация в ручную Интерфейс Externalizable Методы readExternal(ObjectInput in) – должен прочесть состояние из потока writeExternal(ObjectOutput out) – должен записать состояние в поток Процесс чтения Создание конструктором по умолчанию Вызов метода readExternal
10Georgiy KorneevJava Advanced / Сериализация и RMI Настраиваемая сериализация Применяется для обеспечения совместимости Методы readObject(ObjectInputStream in) – должен прочесть состояние из потока writeObject(ObjectOutputStream out) – должен записать состояние в поток Процесс чтения Выделение памяти Чтение родителя Вызов метода readObject
11Georgiy KorneevJava Advanced / Сериализация и RMI Запись и чтение дескрипторов Применяется когда сам объект не должен сериализовываться Методы Object writeReplace() – какой объект записать вместо этого Object readResolve() – какой объект реально был записан Реализуются у разных классов
12Georgiy KorneevJava Advanced / Сериализация и RMI Версии сериализованных классов Применяется для обеспечения совместимости когда версии сериализованного объекта меняются Поле private final static long serialVersionUID Инструмент serialver
Концепции RMI Часть 2
14Georgiy KorneevJava Advanced / Сериализация и RMI Remote Method Invocation Механизм, позволяющий объектом из одной Java-машины вызывать методы другой Java-машины RMI работает по сети Пакет java.rmi
15Georgiy KorneevJava Advanced / Сериализация и RMI Схема взаимодействия
16Georgiy KorneevJava Advanced / Сериализация и RMI Удаленные интерфейсы Удаленный интерфейс – интерфейс, унаследованный от Remote Все методы удаленных интерфейсов должны бросать RemoteException
17Georgiy KorneevJava Advanced / Сериализация и RMI Передача данных Объекты, реализующие интерфейс Remote передаются по удаленным ссылкам Остальные объекты передаются по значению путем сериализации
18Georgiy KorneevJava Advanced / Сериализация и RMI Stub и Skeleton Stub и Skeleton генерируются по удаленному классу Stub служит для передачи данных по сети. Реализует все удаленные интерфейсы класса и только их Skeleton служит для приема данных по сети и вызов методов реальтного объекта
19Georgiy KorneevJava Advanced / Сериализация и RMI Distributed Garbage Collecting Удаление объектов, на которых больше не ссылок в распределенной среде Механизм лизинга Интерфейс Unreferenced Метод unreferenced()
20Georgiy KorneevJava Advanced / Сериализация и RMI Поиск удаленных объектов Ссылки на удаленный объекты публикуются в RMI registry Удаленные объекты ищутся по URL вида rmi:// : /, где host:port – местоположение RMI registry object – зарегистрированное имя объекта
21Georgiy KorneevJava Advanced / Сериализация и RMI Прежде чем быть переданными на другую машину объект должен быть экспортирован Метод UnicastRemoteObject.exportObject(object) Наследники UnicastRemoteObject экспортируются автоматически Экспорт объектов
Применение RMI Часть 3
23Georgiy KorneevJava Advanced / Сериализация и RMI Пример: банк Банк поддерживает счета, идентифицируемые строками По счету можно Узнать идентификатор Узнать сумму денег на счете Изменить сумму денег на счете
24Georgiy KorneevJava Advanced / Сериализация и RMI Удаленный интерфейс банка public interface Bank extends Remote { // Создает счет public Account createAccount(String id) throws RemoteException; // Возвращает счет public Account getAccount(String id) throws RemoteException; }
25Georgiy KorneevJava Advanced / Сериализация и RMI Удаленный интерфейс счета public interface Account extends Remote { // Узнать идентификатор public String getId() throws RemoteException; // Узнать количество денег public int getAmount() throws RemoteException; // Установить количество денег public void setAmount(int amount) throws RemoteException; }
26Georgiy KorneevJava Advanced / Сериализация и RMI Реализация счета Класс AccountImpl implements Account public String getId() { return id; } public int getAmount() { return amount; } public void setAmount(int amount) { this.amount = amount; }
27Georgiy KorneevJava Advanced / Сериализация и RMI Реализация банка Класс 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); }
28Georgiy KorneevJava Advanced / Сериализация и RMI Сервер Регистрация банка в 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"); }
29Georgiy KorneevJava Advanced / Сериализация и RMI Клиент (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; }
30Georgiy KorneevJava Advanced / Сериализация и RMI Клиент (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"); }
31Georgiy KorneevJava Advanced / Сериализация и RMI Клиент (3) Операции со счетом System.out.println("Money: " + account.getAmount()); System.out.println("Adding money"); account.setAmount(account.getAmount() + 100); System.out.println("Money: " + account.getAmount());
32Georgiy KorneevJava Advanced / Сериализация и RMI Запуск Создание Stub для классов rmic AccountImpl BankImpl Запуск RMI Registry rmiregistry Запуск сервера Запуск клиента
33Georgiy KorneevJava Advanced / Сериализация и RMI Дополнительные возможности RMI Использование callback процедур Activation – технология, позволяющая создавать удаленные объекты Загрузка.class файлов с HTTP сервера
Заключение Часть 4
35Georgiy KorneevJava Advanced / Сериализация и RMI Ссылки по сериализации Java Object Serialization Specification // alization/spec/serialTOC.html alization/spec/serialTOC.html Object Serialization (Guide) // alization/index.html alization/index.html Serialization (Tutorial) // Programming/BasicJava2/serial.html Programming/BasicJava2/serial.html Serialization FAQ // aq/ aq/
36Georgiy KorneevJava Advanced / Сериализация и RMI Ссылки по RMI RMI (Guide & tutotials) Java RMI Specification // spec/rmiTOC.html spec/rmiTOC.html RMI Tutorial // mi/RMI.html mi/RMI.html
37Georgiy KorneevJava Advanced / Сериализация и RMI Вопросы