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

37
Сериализация и RMI Java Advanced

description

Сериализация и RMI. Java Advanced. Содержание. Сериализация Концепции RMI Применение RMI Заключение. Часть 1. Сериализация. Сериализация и десериализация. Сериализация – запись объекта в байтовый поток Десериализация – чтение объекта из байтового потока Пакет java.io - PowerPoint PPT Presentation

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

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

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

Java Advanced

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

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

Содержание

СериализацияКонцепции RMIПрименение RMIЗаключение

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

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

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

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

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

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

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

Пакет java.io

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

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

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

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

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

ClassNotFoundException InvalidClassException

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

был записан

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

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

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

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

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

Поле private final static long serialVersionUID

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

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

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

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

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

Remote Method Invocation

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

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

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

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

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

Transport Layer

Remote Reference Layer Remote Reference Layer

Stub Skeleton

Client Server

IInterface IInterface

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

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

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

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

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

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

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

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

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

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

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

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

Stub и Skeleton

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

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

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

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

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

Distributed Garbage Collecting

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

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

Метод unreferenced()

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

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

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

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

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

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

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

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

Метод UnicastRemoteObject.exportObject(object)

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

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

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

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

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

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

Пример: банк

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

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

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

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

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

public interface Bank extends Remote {

// Создает счет

public Account createAccount(String id)

throws RemoteException;

// Возвращает счет

public Account getAccount(String id)

throws RemoteException;

}

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

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

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

public interface Account extends Remote {

// Узнать идентификатор

public String getId()

throws RemoteException;

// Узнать количество денег

public int getAmount()

throws RemoteException;

// Установить количество денег

public void setAmount(int amount)

throws RemoteException;

}

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

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

Реализация счета

Класс AccountImpl implements Accountpublic String getId() {

return id;

}

public int getAmount() {

return amount;

}

public void setAmount(int amount) {

this.amount = amount;

}

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

Java Advanced / Сериализация и RMI 27Georgiy 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 28: Сериализация и  RMI

Java Advanced / Сериализация и RMI 28Georgiy 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 29: Сериализация и  RMI

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

Клиент (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;}

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

Java Advanced / Сериализация и RMI 30Georgiy 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 31: Сериализация и  RMI

Java Advanced / Сериализация и RMI 31Georgiy 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 32: Сериализация и  RMI

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

Запуск

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

Запуск RMI Registry rmiregistry

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

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

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

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

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

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

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

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

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

Java Advanced / Сериализация и RMI 35Georgiy 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 36: Сериализация и  RMI

Java Advanced / Сериализация и RMI 36Georgiy 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 37: Сериализация и  RMI

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

Вопросы