Top Banner
Сериализация и RMI Java Advanced
44

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

Jan 20, 2016

Download

Documents

tamber

Сериализация и RMI. Java Advanced. Содержание. Сериализация Концепции RMI Применение RMI Дополнительные возможности RMI Заключение. Часть 1. Сериализация. Сериализация и десериализация. Сериализация – запись объекта в байтовый поток - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Сериализация и  RMI

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

Java Advanced

Page 2: Сериализация и  RMI

Java Advanced / Сериализация и RMI 2Georgiy Korneev

Содержание

СериализацияКонцепции RMIПрименение RMIДополнительные возможности RMIЗаключение

Page 3: Сериализация и  RMI

СериализацияЧасть 1

Page 4: Сериализация и  RMI

Java Advanced / Сериализация и RMI 4Georgiy Korneev

Сериализация и десериализация

Сериализация – запись объекта в байтовый поток

Десериализация – чтение объекта из байтового потока

Пакет java.io

При сериализации и десериализация используется все данные, которые достижимы из объекта

Page 5: Сериализация и  RMI

Java Advanced / Сериализация и RMI 5Georgiy Korneev

Сериализация объектов

Запись объектов Интерфейс ObjectOutput extends DataOutput Класс ObjectOutputStream Метод writeObject(object) Исключение NotSerializableException

Page 6: Сериализация и  RMI

Java Advanced / Сериализация и RMI 6Georgiy Korneev

Десериализация объектов

Чтение объектов Интерфейс ObjectInput extends DataInput Класс ObjectInputStream Метод readObject() Исключение

ClassNotFoundException InvalidClassException

Page 7: Сериализация и  RMI

Java Advanced / Сериализация и RMI 7Georgiy Korneev

Что можно сериализовать

Автоматически сериализуемые классы Маркерный интерфейс Serializable

Классы, сериализуемые вручную Интерфейс Externalizable extends Serializable

Page 8: Сериализация и  RMI

Java Advanced / Сериализация и RMI 8Georgiy Korneev

Автоматическая сериализация

Процесс записи Записывается предок Записываются значения всех полей, не

имеющих модификатора transient

Процесс чтения Выделяется память под объект Считывается предок Считываются значения всех полей , не

имеющих модификатора transient

Page 9: Сериализация и  RMI

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

Java Advanced / Сериализация и RMI 10Georgiy Korneev

Сериализация в ручную

Интерфейс ExternalizableМетоды

readExternal(ObjectInput in) – должен прочесть состояние из потока

writeExternal(ObjectOutput out) – должен записать состояние в поток

Процесс чтения Создание конструктором по умолчанию Вызов метода readExternal

Page 11: Сериализация и  RMI

Java Advanced / Сериализация и RMI 11Georgiy Korneev

Настраиваемая сериализация

Применяется для обеспечения совместимости

Методы readObject(ObjectInputStream in) – должен

прочесть состояние из потока writeObject(ObjectOutputStream out) – должен

записать состояние в потокПроцесс чтения

Выделение памяти Чтение родителя Вызов метода readObject

Page 12: Сериализация и  RMI

Java Advanced / Сериализация и RMI 12Georgiy Korneev

Сериализация с несериализуемым предком

Несериализуемый предок должен иметь конструктор по умолчанию

ObjectOuputStream.defaultWriteObject() – записывает поля текущего класса

ObjectInoutStream.defaultReadObject() – считывает поля текущего класса

Page 13: Сериализация и  RMI

Java Advanced / Сериализация и RMI 13Georgiy Korneev

Версии сериализованных классов

Применяется для обеспечения совместимости когда версии сериализованного объекта меняются

Поле private final static long serialVersionUID

Инструмент serialver <имя класса>

Page 14: Сериализация и  RMI

Java Advanced / Сериализация и RMI 14Georgiy Korneev

Русная сериализация полей

Константа ObjectStreamField[] serialPersistentFields – сериализуемые поля

ObjectOutputStream.PutField putFields() – поля для записи

writeFields() – записывает поляObjectInputStream.GetField getFields() –

читает поля из потока

Page 15: Сериализация и  RMI

Java Advanced / Сериализация и RMI 15Georgiy Korneev

Запись и чтение дескрипторов

Применяется когда сам объект не должен сериализовываться

Методы Object writeReplace() – какой объект записать

вместо этого Object readResolve() – какой объект реально

был записан

Реализуются у разных классов

Page 16: Сериализация и  RMI

Концепции RMIЧасть 2

Page 17: Сериализация и  RMI

Java Advanced / Сериализация и RMI 17Georgiy Korneev

Remote Method Invocation

Механизм, позволяющий объектом из одной Java-машины вызывать методы другой Java-машины

RMI работает по сетиПакет java.rmi

Page 18: Сериализация и  RMI

Java Advanced / Сериализация и RMI 18Georgiy Korneev

Схема взаимодействия

Transport Layer

Remote Reference Layer Remote Reference Layer

Stub Skeleton

Client Server

IInterface IInterface

Page 19: Сериализация и  RMI

Java Advanced / Сериализация и RMI 19Georgiy Korneev

Удаленные интерфейсы

Удаленный интерфейс – интерфейс, унаследованный от Remote

Все методы удаленных интерфейсов должны бросать RemoteException

Page 20: Сериализация и  RMI

Java Advanced / Сериализация и RMI 20Georgiy Korneev

Передача данных

Объекты, реализующие интерфейс Remote передаются по удаленным ссылкам

Остальные объекты передаются по значению путем сериализации

Page 21: Сериализация и  RMI

Java Advanced / Сериализация и RMI 21Georgiy Korneev

Stub и Skeleton

Stub и Skeleton генерируются по удаленному классу

Stub служит для передачи данных по сети. Реализует все удаленные интерфейсы класса и только их

Skeleton служит для приема данных по сети и вызов методов реальтного объекта

Page 22: Сериализация и  RMI

Java Advanced / Сериализация и RMI 22Georgiy Korneev

Distributed Garbage Collecting

Удаление объектов, на которых больше не ссылок в распределенной среде

Механизм лизингаИнтерфейс Unreferenced

Метод unreferenced()

Page 23: Сериализация и  RMI

Java Advanced / Сериализация и RMI 23Georgiy Korneev

Поиск удаленных объектов (1)

Ссылки на удаленный объекты публикуются в RMI registry

Удаленные объекты ищутся по URL вида rmi://<host>:<port>/<object>, где host:port – местоположение RMI registry object – зарегистрированное имя объекта

Page 24: Сериализация и  RMI

Java Advanced / Сериализация и RMI 24Georgiy Korneev

Поиск удаленных объектов (2)

Класс Naming – интерфейс к RMI registryМетоды класса

bind(name, object) – зарегистрировать объект lookup(name) – получить объект по имени unbind(name) – отменить регистрацию объекта rebind(name, object) – зарегистрировать новый

объект

Page 25: Сериализация и  RMI

Java Advanced / Сериализация и RMI 25Georgiy Korneev

Прежде чем быть переданными на другую машину объект должен быть экспортирован

Метод UnicastRemoteObject.exportObject(object)

Наследники UnicastRemoteObject экспортируются автоматически

Экспорт объектов

Page 26: Сериализация и  RMI

Применение RMIЧасть 3

Page 27: Сериализация и  RMI

Java Advanced / Сериализация и RMI 27Georgiy Korneev

Пример: банк

Банк поддерживает счета, идентифицируемые строками

По счету можно Узнать идентификатор Узнать сумму денег на счете Изменить сумму денег на счете

Page 28: Сериализация и  RMI

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

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

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

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

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

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

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

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

Java Advanced / Сериализация и RMI 36Georgiy Korneev

Запуск

Создание Stub для классов rmic AccountImpl BankImpl

Запуск RMI Registry rmiregistry

Запуск сервераЗапуск клиента

Page 37: Сериализация и  RMI

Дополнительные возможности RMI

Часть 4

Page 38: Сериализация и  RMI

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

Java Advanced / Сериализация и RMI 39Georgiy Korneev

Создание Registry на лету

Интерфейс Registry – экземпляр RMI registry

Класс LocateRegistry – позволяет находить и создавать экземпляры RMI registry getRegistry(host?, port?) – найти RMI registry createRegistry(port) – создать экземпляр RMI

registry

Page 40: Сериализация и  RMI

Java Advanced / Сериализация и RMI 40Georgiy Korneev

Дополнительные возможности RMI

Использование callback процедурActivation – технология, позволяющая

создавать удаленные объектыЗагрузка .class файлов с HTTP сервера

Page 41: Сериализация и  RMI

ЗаключениеЧасть 5

Page 42: Сериализация и  RMI

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

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

Java Advanced / Сериализация и RMI 44Georgiy Korneev

Вопросы