450 likes | 668 Views
Сериализация и RMI. Java Advanced. http://kgeorgiy.info/courses/java-advanced/. Содержание. Сериализация Концепции RMI Применение RMI Дополнительные возможности RMI Заключение. Часть 1. Сериализация. Сериализация и десериализация. Сериализация – запись объекта в байтовый поток
E N D
Сериализацияи RMI Java Advanced http://kgeorgiy.info/courses/java-advanced/
Содержание • Сериализация • Концепции RMI • Применение RMI • Дополнительные возможности RMI • Заключение Java Advanced / Сериализация иRMI
Часть 1 Сериализация
Сериализация и десериализация • Сериализация – запись объекта в байтовый поток • Десериализация – чтение объекта из байтового потока • Пакет java.io • При сериализации и десериализация используется все данные, которые достижимы из объекта Java Advanced / Сериализация иRMI
Сериализация объектов • Запись объектов • Интерфейс ObjectOutput extends DataOutput • Класс ObjectOutputStream • Метод writeObject(object) • Исключение NotSerializableException Java Advanced / Сериализация иRMI
Десериализацияобъектов • Чтение объектов • Интерфейс ObjectInputextends DataInput • Класс ObjectInputStream • Метод readObject() • Исключение • ClassNotFoundException • InvalidClassException Java Advanced / Сериализация иRMI
Что можно сериализовать • Автоматически сериализуемые классы • Маркерный интерфейс Serializable • Классы, сериализуемые вручную • Интерфейс Externalizable extends Serializable Java Advanced / Сериализация иRMI
Автоматическая сериализация • Процесс записи • Записывается предок • Записываются значения всех полей, не имеющих модификатора transient • Процесс чтения • Выделяется память под объект • Считывается предок • Считываются значения всех полей, не имеющих модификатора transient Java Advanced / Сериализация иRMI
Пример 1. Автоматическая сериализация public class Data implements Serializable { private List<Integer> data; ... } public class Data2 extends Data { private transient String toStringCache; ... } Java Advanced / Сериализация иRMI
Сериализация в ручную • Интерфейс Externalizable • Методы • readExternal(ObjectInput in) – должен прочесть состояние из потока • writeExternal(ObjectOutput out) – должен записать состояние в поток • Процесс чтения • Создание конструктором по умолчанию • Вызов метода readExternal Java Advanced / Сериализация иRMI
Настраиваемая сериализация • Применяется для обеспечения совместимости • Методы • readObject(ObjectInputStream in)– должен прочесть состояние из потока • writeObject(ObjectOutputStream out) – должен записать состояние в поток • Процесс чтения • Выделение памяти • Вызов метода readObject Java Advanced / Сериализация иRMI
Сериализация с несериализуемым предком • Несериализуемый предок должен иметь конструктор по умолчанию • ObjectOutputStream.defaultWriteObject() – записывает поля текущего класса • ObjectInputStream.defaultReadObject() – считывает поля текущего класса Java Advanced / Сериализация иRMI
Версии сериализованных классов • Применяется для обеспечения совместимости когда версии сериализованного объекта меняются • Поле • private final static long serialVersionUID • Инструмент • serialver <имя класса> Java Advanced / Сериализация иRMI
Ручная сериализация полей • Константа ObjectStreamField[] serialPersistentFields– сериализуемые поля • ObjectOutputStream.PutField putFields() – поля для записи • writeFields()– записывает поля • ObjectInputStream.GetField readFields() – читает поля из потока Java Advanced / Сериализация иRMI
Старая версия class Rectangle { int x1; int y1; int x2; int y2; } Новая версия class Rectangle { int x; int y; int width; int height; } Пример ручной сериализации (1) Java Advanced / Сериализация иRMI
Записьи чтение дескрипторов • Применяется когда сам объект не должен сериализовываться • Методы • Object writeReplace() – какой объект записать вместо этого • Object readResolve()– какой объект реально был записан • Реализуются у разных классов Java Advanced / Сериализация иRMI
Часть 2 Концепции RMI
Remote Method Invocation • Механизм, позволяющий объектом из одной Java-машины вызывать методы другой Java-машины • RMI работает по сети • Пакетjava.rmi Java Advanced / Сериализация иRMI
Схема взаимодействия Java Advanced / Сериализация иRMI
Удаленные интерфейсы • Удаленный интерфейс – интерфейс, унаследованный от Remote • Все методы удаленных интерфейсов должны бросать RemoteException Java Advanced / Сериализация иRMI
Передача данных • Объекты, реализующие интерфейс Remoteпередаются по удаленным ссылкам • Остальные объекты передаются по значению путем сериализации Java Advanced / Сериализация иRMI
Stub и Skeleton • Stubи Skeletonгенерируются по удаленному классу • Stubслужит для передачи данных по сети. Реализует все удаленные интерфейсы класса и только их • Skeletonслужит для приема данных по сети и вызов методов реального объекта Java Advanced / Сериализация иRMI
Distributed Garbage Collecting • Удаление объектов, на которых больше не ссылок в распределенной среде • Механизм лизинга • Интерфейс Unreferenced • Метод unreferenced() Java Advanced / Сериализация иRMI
Поиск удаленных объектов (1) • Ссылки на удаленный объекты публикуются в RMI registry • Удаленные объекты ищутся по URLвида rmi://<host>:<port>/<object>,где • host:port – местоположение RMI registry • object – зарегистрированное имя объекта Java Advanced / Сериализация иRMI
Поиск удаленных объектов (2) • Класс Naming – интерфейс к RMI registry • Методы класса • bind(name, object) – зарегистрировать объект • lookup(name) – получить объект по имени • unbind(name) – отменить регистрацию объекта • rebind(name, object) – зарегистрировать новый объект Java Advanced / Сериализация иRMI
Экспорт объектов • Прежде чем быть переданными на другую машину объект должен быть экспортирован • Метод • UnicastRemoteObject.exportObject(object) • Наследники UnicastRemoteObject экспортируются автоматически Java Advanced / Сериализация иRMI
Часть 3 Применение RMI
Пример: банк • Банк поддерживает счета, идентифицируемые строками • По счету можно • Узнать идентификатор • Узнать сумму денег на счете • Изменить сумму денег на счете Java Advanced / Сериализация иRMI
Удаленный интерфейс банка public interface Bank extends Remote { // Создает счет public Account createAccount(String id) throws RemoteException; // Возвращает счет public Account getAccount(String id) throws RemoteException; } Java Advanced / Сериализация иRMI
Удаленный интерфейс счета public interface Account extends Remote { // Узнать идентификатор public String getId() throws RemoteException; // Узнать количество денег public int getAmount() throws RemoteException; // Установить количество денег public void setAmount(int amount) throws RemoteException; } Java Advanced / Сериализация иRMI
Реализация счета • Класс AccountImpl implements Account public String getId() { return id; } public int getAmount() { return amount; } public void setAmount(int amount) { this.amount = amount; } Java 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); } Java 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"); } Java Advanced / Сериализация иRMI
Клиент (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; } Java 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"); } Java 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()); Java Advanced / Сериализация иRMI
Запуск • Создание Stubдля классов • rmic AccountImpl BankImpl • Запуск RMI Registry • rmiregistry • Запуск сервера • Запуск клиента Java Advanced / Сериализация иRMI
Часть 4 Дополнительные возможности RMI
Фабрики сокетов • Класс RMIClientSocketFactory – фабрика клиентских сокетов • Метод Socket createSocket(String host, int port) • Класс RMIServerSocketFactory – фабрика серверных сокетов • Метод ServerSocket createServerSocket(int port) • Класс RMISocketFactory – фабрика сокетов, применяемая по умолчанию • UnicastRemoteObject.exportObject(object, port, csf, ssf) – экспортирует объект Java Advanced / Сериализация иRMI
Создание Registry на лету • Интерфейс Registry – экземпляр RMI registry • Класс LocateRegistry – позволяет находить и создавать экземпляры RMI registry • getRegistry(host?, port?) – найти RMI registry • createRegistry(port) – создать экземпляр RMI registry Java Advanced / Сериализация иRMI
Дополнительные возможности RMI • Использование callback процедур • Activation – технология, позволяющая создавать удаленные объекты • Загрузка .classфайлов с HTTP сервера Java Advanced / Сериализация иRMI
Часть 5 Заключение
Ссылкипо сериализации • 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/ Java Advanced / Сериализация иRMI
Ссылкипо 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 Java Advanced / Сериализация иRMI
Вопросы Java Advanced / Сериализация иRMI