slide1 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Сериализация и RMI PowerPoint Presentation
Download Presentation
Сериализация и RMI

Loading in 2 Seconds...

play fullscreen
1 / 45

Сериализация и RMI - PowerPoint PPT Presentation


  • 172 Views
  • Uploaded on

Сериализация и RMI. Java Advanced. http://kgeorgiy.info/courses/java-advanced/. Содержание. Сериализация Концепции RMI Применение RMI Дополнительные возможности RMI Заключение. Часть 1. Сериализация. Сериализация и десериализация. Сериализация – запись объекта в байтовый поток

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Сериализация и RMI' - sonya-price


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide1

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

Java Advanced

http://kgeorgiy.info/courses/java-advanced/

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

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

slide4
Сериализация и десериализация
  • Сериализация – запись объекта в байтовый поток
  • Десериализация – чтение объекта из байтового потока
  • Пакет java.io
  • При сериализации и десериализация используется все данные, которые достижимы из объекта

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

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

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

slide6
Десериализацияобъектов
  • Чтение объектов
    • Интерфейс ObjectInputextends DataInput
    • Класс ObjectInputStream
    • Метод readObject()
    • Исключение
      • ClassNotFoundException
      • InvalidClassException

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

slide7
Что можно сериализовать
  • Автоматически сериализуемые классы
    • Маркерный интерфейс Serializable
  • Классы, сериализуемые вручную
    • Интерфейс Externalizable extends Serializable

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

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

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

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

public class Data implements Serializable {

private List<Integer> data;

...

}

public class Data2 extends Data {

private transient String toStringCache;

...

}

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

slide10
Сериализация в ручную
  • Интерфейс Externalizable
  • Методы
    • readExternal(ObjectInput in) – должен прочесть состояние из потока
    • writeExternal(ObjectOutput out) – должен записать состояние в поток
  • Процесс чтения
    • Создание конструктором по умолчанию
    • Вызов метода readExternal

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

slide11
Настраиваемая сериализация
  • Применяется для обеспечения совместимости
  • Методы
    • readObject(ObjectInputStream in)– должен прочесть состояние из потока
    • writeObject(ObjectOutputStream out) – должен записать состояние в поток
  • Процесс чтения
    • Выделение памяти
    • Вызов метода readObject

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

slide12
Сериализация с несериализуемым предком
  • Несериализуемый предок должен иметь конструктор по умолчанию
  • ObjectOutputStream.defaultWriteObject() – записывает поля текущего класса
  • ObjectInputStream.defaultReadObject() – считывает поля текущего класса

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

slide13
Версии сериализованных классов
  • Применяется для обеспечения совместимости когда версии сериализованного объекта меняются
  • Поле
    • private final static long serialVersionUID
  • Инструмент
    • serialver <имя класса>

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

slide14
Ручная сериализация полей
  • Константа ObjectStreamField[] serialPersistentFields– сериализуемые поля
  • ObjectOutputStream.PutField putFields() – поля для записи
  • writeFields()– записывает поля
  • ObjectInputStream.GetField readFields() – читает поля из потока

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

slide15
Старая версия

class Rectangle {

int x1;

int y1;

int x2;

int y2;

}

Новая версия

class Rectangle {

int x;

int y;

int width;

int height;

}

Пример ручной сериализации (1)

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

slide16
Записьи чтение дескрипторов
  • Применяется когда сам объект не должен сериализовываться
  • Методы
    • Object writeReplace() – какой объект записать вместо этого
    • Object readResolve()– какой объект реально был записан
  • Реализуются у разных классов

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

remote method invocation
Remote Method Invocation
  • Механизм, позволяющий объектом из одной Java-машины вызывать методы другой Java-машины
  • RMI работает по сети
  • Пакетjava.rmi

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

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

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

slide20
Удаленные интерфейсы
  • Удаленный интерфейс – интерфейс, унаследованный от Remote
  • Все методы удаленных интерфейсов должны бросать RemoteException

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

slide21
Передача данных
  • Объекты, реализующие интерфейс Remoteпередаются по удаленным ссылкам
  • Остальные объекты передаются по значению путем сериализации

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

stub skeleton
Stub и Skeleton
  • Stubи Skeletonгенерируются по удаленному классу
  • Stubслужит для передачи данных по сети. Реализует все удаленные интерфейсы класса и только их
  • Skeletonслужит для приема данных по сети и вызов методов реального объекта

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

distributed garbage collecting
Distributed Garbage Collecting
  • Удаление объектов, на которых больше не ссылок в распределенной среде
  • Механизм лизинга
  • Интерфейс Unreferenced
    • Метод unreferenced()

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

slide24
Поиск удаленных объектов (1)
  • Ссылки на удаленный объекты публикуются в RMI registry
  • Удаленные объекты ищутся по URLвида rmi://<host>:<port>/<object>,где
    • host:port – местоположение RMI registry
    • object – зарегистрированное имя объекта

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

slide25
Поиск удаленных объектов (2)
  • Класс Naming – интерфейс к RMI registry
  • Методы класса
    • bind(name, object) – зарегистрировать объект
    • lookup(name) – получить объект по имени
    • unbind(name) – отменить регистрацию объекта
    • rebind(name, object) – зарегистрировать новый объект

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

slide26
Экспорт объектов
  • Прежде чем быть переданными на другую машину объект должен быть экспортирован
  • Метод
    • UnicastRemoteObject.exportObject(object)
  • Наследники UnicastRemoteObject экспортируются автоматически

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

slide28
Пример: банк
  • Банк поддерживает счета, идентифицируемые строками
  • По счету можно
    • Узнать идентификатор
    • Узнать сумму денег на счете
    • Изменить сумму денег на счете

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

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

public interface Bank extends Remote {

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

public Account createAccount(String id)

throws RemoteException;

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

public Account getAccount(String id)

throws RemoteException;

}

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

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

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

slide31
Реализация счета
  • Класс AccountImpl implements Account

public String getId() {

return id;

}

public int getAmount() {

return amount;

}

public void setAmount(int amount) {

this.amount = amount;

}

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

slide32
Реализация банка
  • Класс 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

slide33
Сервер
  • Регистрация банкав 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

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

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

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

slide37
Запуск
  • Создание Stubдля классов
    • rmic AccountImpl BankImpl
  • Запуск RMI Registry
    • rmiregistry
  • Запуск сервера
  • Запуск клиента

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

slide39
Фабрики сокетов
  • Класс RMIClientSocketFactory – фабрика клиентских сокетов
    • Метод Socket createSocket(String host, int port)
  • Класс RMIServerSocketFactory – фабрика серверных сокетов
    • Метод ServerSocket createServerSocket(int port)
  • Класс RMISocketFactory – фабрика сокетов, применяемая по умолчанию
  • UnicastRemoteObject.exportObject(object, port, csf, ssf) – экспортирует объект

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

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

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

slide41
Дополнительные возможности RMI
  • Использование callback процедур
  • Activation – технология, позволяющая создавать удаленные объекты
  • Загрузка .classфайлов с HTTP сервера

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

slide43
Ссылкипо сериализации
  • 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

slide44
Ссылкипо 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

slide45
Вопросы

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