Сериализация и RMI
Java Advanced
Java Advanced / Сериализация и RMI 2Georgiy Korneev
Содержание
СериализацияКонцепции RMIПрименение RMIДополнительные возможности RMIЗаключение
СериализацияЧасть 1
Java Advanced / Сериализация и RMI 4Georgiy Korneev
Сериализация и десериализация
Сериализация – запись объекта в байтовый поток
Десериализация – чтение объекта из байтового потока
Пакет java.io
При сериализации и десериализация используется все данные, которые достижимы из объекта
Java Advanced / Сериализация и RMI 5Georgiy Korneev
Сериализация объектов
Запись объектов Интерфейс ObjectOutput extends DataOutput Класс ObjectOutputStream Метод writeObject(object) Исключение NotSerializableException
Java Advanced / Сериализация и RMI 6Georgiy Korneev
Десериализация объектов
Чтение объектов Интерфейс ObjectInput extends DataInput Класс ObjectInputStream Метод readObject() Исключение
ClassNotFoundException InvalidClassException
Java Advanced / Сериализация и RMI 7Georgiy Korneev
Что можно сериализовать
Автоматически сериализуемые классы Маркерный интерфейс Serializable
Классы, сериализуемые вручную Интерфейс Externalizable extends Serializable
Java Advanced / Сериализация и RMI 8Georgiy Korneev
Автоматическая сериализация
Процесс записи Записывается предок Записываются значения всех полей, не
имеющих модификатора transient
Процесс чтения Выделяется память под объект Считывается предок Считываются значения всех полей , не
имеющих модификатора transient
Java Advanced / Сериализация и RMI 9Georgiy Korneev
Пример 1. Автоматическая сериализация
public class Data implements Serializable {
private List<Integer> data;
...
}
public class Data2 extends Data {
private transient String toStringCache;
...
}
Java Advanced / Сериализация и RMI 10Georgiy Korneev
Сериализация в ручную
Интерфейс ExternalizableМетоды
readExternal(ObjectInput in) – должен прочесть состояние из потока
writeExternal(ObjectOutput out) – должен записать состояние в поток
Процесс чтения Создание конструктором по умолчанию Вызов метода readExternal
Java Advanced / Сериализация и RMI 11Georgiy Korneev
Настраиваемая сериализация
Применяется для обеспечения совместимости
Методы readObject(ObjectInputStream in) – должен
прочесть состояние из потока writeObject(ObjectOutputStream out) – должен
записать состояние в потокПроцесс чтения
Выделение памяти Чтение родителя Вызов метода readObject
Java Advanced / Сериализация и RMI 12Georgiy Korneev
Сериализация с несериализуемым предком
Несериализуемый предок должен иметь конструктор по умолчанию
ObjectOuputStream.defaultWriteObject() – записывает поля текущего класса
ObjectInoutStream.defaultReadObject() – считывает поля текущего класса
Java Advanced / Сериализация и RMI 13Georgiy Korneev
Версии сериализованных классов
Применяется для обеспечения совместимости когда версии сериализованного объекта меняются
Поле private final static long serialVersionUID
Инструмент serialver <имя класса>
Java Advanced / Сериализация и RMI 14Georgiy Korneev
Русная сериализация полей
Константа ObjectStreamField[] serialPersistentFields – сериализуемые поля
ObjectOutputStream.PutField putFields() – поля для записи
writeFields() – записывает поляObjectInputStream.GetField getFields() –
читает поля из потока
Java Advanced / Сериализация и RMI 15Georgiy Korneev
Запись и чтение дескрипторов
Применяется когда сам объект не должен сериализовываться
Методы Object writeReplace() – какой объект записать
вместо этого Object readResolve() – какой объект реально
был записан
Реализуются у разных классов
Концепции RMIЧасть 2
Java Advanced / Сериализация и RMI 17Georgiy Korneev
Remote Method Invocation
Механизм, позволяющий объектом из одной Java-машины вызывать методы другой Java-машины
RMI работает по сетиПакет java.rmi
Java Advanced / Сериализация и RMI 18Georgiy Korneev
Схема взаимодействия
Transport Layer
Remote Reference Layer Remote Reference Layer
Stub Skeleton
Client Server
IInterface IInterface
Java Advanced / Сериализация и RMI 19Georgiy Korneev
Удаленные интерфейсы
Удаленный интерфейс – интерфейс, унаследованный от Remote
Все методы удаленных интерфейсов должны бросать RemoteException
Java Advanced / Сериализация и RMI 20Georgiy Korneev
Передача данных
Объекты, реализующие интерфейс Remote передаются по удаленным ссылкам
Остальные объекты передаются по значению путем сериализации
Java Advanced / Сериализация и RMI 21Georgiy Korneev
Stub и Skeleton
Stub и Skeleton генерируются по удаленному классу
Stub служит для передачи данных по сети. Реализует все удаленные интерфейсы класса и только их
Skeleton служит для приема данных по сети и вызов методов реальтного объекта
Java Advanced / Сериализация и RMI 22Georgiy Korneev
Distributed Garbage Collecting
Удаление объектов, на которых больше не ссылок в распределенной среде
Механизм лизингаИнтерфейс Unreferenced
Метод unreferenced()
Java Advanced / Сериализация и RMI 23Georgiy Korneev
Поиск удаленных объектов (1)
Ссылки на удаленный объекты публикуются в RMI registry
Удаленные объекты ищутся по URL вида rmi://<host>:<port>/<object>, где host:port – местоположение RMI registry object – зарегистрированное имя объекта
Java Advanced / Сериализация и RMI 24Georgiy Korneev
Поиск удаленных объектов (2)
Класс Naming – интерфейс к RMI registryМетоды класса
bind(name, object) – зарегистрировать объект lookup(name) – получить объект по имени unbind(name) – отменить регистрацию объекта rebind(name, object) – зарегистрировать новый
объект
Java Advanced / Сериализация и RMI 25Georgiy Korneev
Прежде чем быть переданными на другую машину объект должен быть экспортирован
Метод UnicastRemoteObject.exportObject(object)
Наследники UnicastRemoteObject экспортируются автоматически
Экспорт объектов
Применение RMIЧасть 3
Java Advanced / Сериализация и RMI 27Georgiy Korneev
Пример: банк
Банк поддерживает счета, идентифицируемые строками
По счету можно Узнать идентификатор Узнать сумму денег на счете Изменить сумму денег на счете
Java Advanced / Сериализация и RMI 28Georgiy Korneev
Удаленный интерфейс банка
public interface Bank extends Remote {
// Создает счет
public Account createAccount(String id)
throws RemoteException;
// Возвращает счет
public Account getAccount(String id)
throws RemoteException;
}
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;
}
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;
}
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);
}
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");}
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;
}
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");
}
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());
Java Advanced / Сериализация и RMI 36Georgiy Korneev
Запуск
Создание Stub для классов rmic AccountImpl BankImpl
Запуск RMI Registry rmiregistry
Запуск сервераЗапуск клиента
Дополнительные возможности RMI
Часть 4
Java Advanced / Сериализация и RMI 38Georgiy Korneev
Фабрики сокетов
Класс RMIClientSocketFactory – фабрика клиентских сокетов Метод Socket createSocket(String host, int port)
Класс RMIServerSocketFactory – фабрика серверных сокетов Метод ServerSocket createServerSocket(int port)
Класс RMISocketFactory – фабрика сокетов, применяемая по умолчанию
UnicastRemoteObject.exportObject(object, port, csf, ssf) – экспортирует объект
Java Advanced / Сериализация и RMI 39Georgiy Korneev
Создание Registry на лету
Интерфейс Registry – экземпляр RMI registry
Класс LocateRegistry – позволяет находить и создавать экземпляры RMI registry getRegistry(host?, port?) – найти RMI registry createRegistry(port) – создать экземпляр RMI
registry
Java Advanced / Сериализация и RMI 40Georgiy Korneev
Дополнительные возможности RMI
Использование callback процедурActivation – технология, позволяющая
создавать удаленные объектыЗагрузка .class файлов с HTTP сервера
ЗаключениеЧасть 5
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/
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
Java Advanced / Сериализация и RMI 44Georgiy Korneev
Вопросы
Top Related