🗊Презентация Подготовка класса к использованию в Java. (Лекция 9)

Нажмите для полного просмотра!
Подготовка класса к использованию в Java. (Лекция 9), слайд №1Подготовка класса к использованию в Java. (Лекция 9), слайд №2Подготовка класса к использованию в Java. (Лекция 9), слайд №3Подготовка класса к использованию в Java. (Лекция 9), слайд №4Подготовка класса к использованию в Java. (Лекция 9), слайд №5Подготовка класса к использованию в Java. (Лекция 9), слайд №6Подготовка класса к использованию в Java. (Лекция 9), слайд №7Подготовка класса к использованию в Java. (Лекция 9), слайд №8Подготовка класса к использованию в Java. (Лекция 9), слайд №9Подготовка класса к использованию в Java. (Лекция 9), слайд №10Подготовка класса к использованию в Java. (Лекция 9), слайд №11Подготовка класса к использованию в Java. (Лекция 9), слайд №12Подготовка класса к использованию в Java. (Лекция 9), слайд №13Подготовка класса к использованию в Java. (Лекция 9), слайд №14Подготовка класса к использованию в Java. (Лекция 9), слайд №15Подготовка класса к использованию в Java. (Лекция 9), слайд №16Подготовка класса к использованию в Java. (Лекция 9), слайд №17Подготовка класса к использованию в Java. (Лекция 9), слайд №18Подготовка класса к использованию в Java. (Лекция 9), слайд №19Подготовка класса к использованию в Java. (Лекция 9), слайд №20Подготовка класса к использованию в Java. (Лекция 9), слайд №21Подготовка класса к использованию в Java. (Лекция 9), слайд №22Подготовка класса к использованию в Java. (Лекция 9), слайд №23Подготовка класса к использованию в Java. (Лекция 9), слайд №24Подготовка класса к использованию в Java. (Лекция 9), слайд №25Подготовка класса к использованию в Java. (Лекция 9), слайд №26Подготовка класса к использованию в Java. (Лекция 9), слайд №27Подготовка класса к использованию в Java. (Лекция 9), слайд №28Подготовка класса к использованию в Java. (Лекция 9), слайд №29Подготовка класса к использованию в Java. (Лекция 9), слайд №30Подготовка класса к использованию в Java. (Лекция 9), слайд №31Подготовка класса к использованию в Java. (Лекция 9), слайд №32Подготовка класса к использованию в Java. (Лекция 9), слайд №33Подготовка класса к использованию в Java. (Лекция 9), слайд №34Подготовка класса к использованию в Java. (Лекция 9), слайд №35Подготовка класса к использованию в Java. (Лекция 9), слайд №36Подготовка класса к использованию в Java. (Лекция 9), слайд №37Подготовка класса к использованию в Java. (Лекция 9), слайд №38Подготовка класса к использованию в Java. (Лекция 9), слайд №39Подготовка класса к использованию в Java. (Лекция 9), слайд №40Подготовка класса к использованию в Java. (Лекция 9), слайд №41Подготовка класса к использованию в Java. (Лекция 9), слайд №42Подготовка класса к использованию в Java. (Лекция 9), слайд №43Подготовка класса к использованию в Java. (Лекция 9), слайд №44Подготовка класса к использованию в Java. (Лекция 9), слайд №45Подготовка класса к использованию в Java. (Лекция 9), слайд №46Подготовка класса к использованию в Java. (Лекция 9), слайд №47Подготовка класса к использованию в Java. (Лекция 9), слайд №48Подготовка класса к использованию в Java. (Лекция 9), слайд №49Подготовка класса к использованию в Java. (Лекция 9), слайд №50Подготовка класса к использованию в Java. (Лекция 9), слайд №51Подготовка класса к использованию в Java. (Лекция 9), слайд №52Подготовка класса к использованию в Java. (Лекция 9), слайд №53Подготовка класса к использованию в Java. (Лекция 9), слайд №54Подготовка класса к использованию в Java. (Лекция 9), слайд №55Подготовка класса к использованию в Java. (Лекция 9), слайд №56Подготовка класса к использованию в Java. (Лекция 9), слайд №57Подготовка класса к использованию в Java. (Лекция 9), слайд №58Подготовка класса к использованию в Java. (Лекция 9), слайд №59

Содержание

Вы можете ознакомиться и скачать презентацию на тему Подготовка класса к использованию в Java. (Лекция 9). Доклад-сообщение содержит 59 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Лекция 9
Описание слайда:
Лекция 9

Слайд 2





Подготовка класса к использованию
Подготовка класса к использованию
Процесс подготовки класса к использованию имеет три стадии
загрузка; 
     получение байт-кода, реализующего класс,  и создание объекта Class;
связывание; 
     проверка того, удовлетворяет ли байт-код синтаксису языка, выделение необходимой памяти для хранения статических данных и (эта функция не обязательна) разрешение всех ссылок, содержащихся в коде класса, с загрузкой, если это необходимо, классов, соответствующих таким ссылкам;
Описание слайда:
Подготовка класса к использованию Подготовка класса к использованию Процесс подготовки класса к использованию имеет три стадии загрузка; получение байт-кода, реализующего класс, и создание объекта Class; связывание; проверка того, удовлетворяет ли байт-код синтаксису языка, выделение необходимой памяти для хранения статических данных и (эта функция не обязательна) разрешение всех ссылок, содержащихся в коде класса, с загрузкой, если это необходимо, классов, соответствующих таким ссылкам;

Слайд 3





3. инициализация; 
3. инициализация; 
инициализация базового класса (с его предварительной загрузкой и связыванием, если это необходимо) и вычисление всех выражений и блоков статической инициализации класса.
Объект Class, возвращаемый методом  defineСlass, служит только цели представления загруженного класса — класс все еще остается не связанным. Выполнение процедуры связывания может быть принудительно спровоцировано вызовом метода resolveClass. 
  Этот метод имеет вид
Описание слайда:
3. инициализация; 3. инициализация; инициализация базового класса (с его предварительной загрузкой и связыванием, если это необходимо) и вычисление всех выражений и блоков статической инициализации класса. Объект Class, возвращаемый методом defineСlass, служит только цели представления загруженного класса — класс все еще остается не связанным. Выполнение процедуры связывания может быть принудительно спровоцировано вызовом метода resolveClass. Этот метод имеет вид

Слайд 4





protected final void resolveClass(Class с) Связывает класс, если тот еще не связан.
protected final void resolveClass(Class с) Связывает класс, если тот еще не связан.
Виртуальная машина, приступая к инициализации класса, проверяет, выполнено ли его связывание. 
   Класс должен быть инициализирован прежде, чем может быть создан объект класса, либо вызван статический метод класса, либо осуществлен доступ к статическому полю класса. 
Особенности процесса зависят от конкретной реализации виртуальной машины Java.
Описание слайда:
protected final void resolveClass(Class с) Связывает класс, если тот еще не связан. protected final void resolveClass(Class с) Связывает класс, если тот еще не связан. Виртуальная машина, приступая к инициализации класса, проверяет, выполнено ли его связывание. Класс должен быть инициализирован прежде, чем может быть создан объект класса, либо вызван статический метод класса, либо осуществлен доступ к статическому полю класса. Особенности процесса зависят от конкретной реализации виртуальной машины Java.

Слайд 5





Загрузка дополнительных ресурсов
Загрузка дополнительных ресурсов
Классы являются основными ресурсами, в которых нуждается программа, но некоторым классам необходимы также дополнительные ресурсы, такие как фрагменты текста, изображения или данные мультимедиа.
Рассмотрим пример загрузки дополнительных ресурсов
 String b = “Str1.fl”;
  InputStream in;
  ClassLoader loader = this.getClass().getClassLoader();
  if (loader!= null)
     in = loader.getResourceAsStream(b); 
  else
     in = ClassLoader.getSystemResourceAsStream(b);
Описание слайда:
Загрузка дополнительных ресурсов Загрузка дополнительных ресурсов Классы являются основными ресурсами, в которых нуждается программа, но некоторым классам необходимы также дополнительные ресурсы, такие как фрагменты текста, изображения или данные мультимедиа. Рассмотрим пример загрузки дополнительных ресурсов String b = “Str1.fl”; InputStream in; ClassLoader loader = this.getClass().getClassLoader(); if (loader!= null) in = loader.getResourceAsStream(b); else in = ClassLoader.getSystemResourceAsStream(b);

Слайд 6





Системные ресурсы связаны с системными классами, а таковые могут не обладать загрузчиками. 
Системные ресурсы связаны с системными классами, а таковые могут не обладать загрузчиками. 
Статический метод getSystemResourceAsStream возвращает объект InputStream потока ввода для ресурса с заданным именем.
Реализация метода getResourceAsStream, предлагаемая классом ClassLoader, предусматривает возврат значения null. 
Задача переопределения метода с поддержкой нужного алгоритма поиска ресурсов возлагается на производный класс загрузчика.
Обычно это значит, что ресурсы будут найдены в тех же местах и теми же способами, что и файлы классов.
Описание слайда:
Системные ресурсы связаны с системными классами, а таковые могут не обладать загрузчиками. Системные ресурсы связаны с системными классами, а таковые могут не обладать загрузчиками. Статический метод getSystemResourceAsStream возвращает объект InputStream потока ввода для ресурса с заданным именем. Реализация метода getResourceAsStream, предлагаемая классом ClassLoader, предусматривает возврат значения null. Задача переопределения метода с поддержкой нужного алгоритма поиска ресурсов возлагается на производный класс загрузчика. Обычно это значит, что ресурсы будут найдены в тех же местах и теми же способами, что и файлы классов.

Слайд 7





Например, для класса PlayerLoader (определенного в предыдущей лекции) имеем:
Например, для класса PlayerLoader (определенного в предыдущей лекции) имеем:
public  InputStream 
                           getResourceAsStream(String name){ 
  try{ 
      return streamFor(name); 
   }catch (IOException e)  {  return null; } 
}  
Два других метода класса ClassLoader, имеющих отношение к проблеме поиска и загрузки ресурсов — getResource и getSystemResource, — возвращают объекты класса URL. 
Метод getContents объекта URL, возвращаемого методами загрузчика классов, позволяет получить объект, представляющий содержимое, соответствующее адресу URL.
Описание слайда:
Например, для класса PlayerLoader (определенного в предыдущей лекции) имеем: Например, для класса PlayerLoader (определенного в предыдущей лекции) имеем: public InputStream getResourceAsStream(String name){ try{ return streamFor(name); }catch (IOException e) { return null; } } Два других метода класса ClassLoader, имеющих отношение к проблеме поиска и загрузки ресурсов — getResource и getSystemResource, — возвращают объекты класса URL. Метод getContents объекта URL, возвращаемого методами загрузчика классов, позволяет получить объект, представляющий содержимое, соответствующее адресу URL.

Слайд 8





Существуют также методы:
Существуют также методы:
public Enumeration findResources(String name)
Возвращает объект Enumeration, который позволяет просматривать объекты URL для всех ресурсов, отвечающих заданному имени. 
Реализация метода,  предлагаемая  по умолчанию  классом  ClassLoader,  возвращает объект Enumeration с нулевым числом ресурсов.
public Java.net.URL findResource(String name)
Возвращает объект java.net.URL для ресурса с заданным именем либо null, если таковой не найден. 
Если существует несколько ресурсов, отвечающих заданному имени, правила выбора одного из них определяются конкретной реализацией.
Реализация метода, предлагаемая по умолчанию классом Class Loader, возвращает значение null.
Описание слайда:
Существуют также методы: Существуют также методы: public Enumeration findResources(String name) Возвращает объект Enumeration, который позволяет просматривать объекты URL для всех ресурсов, отвечающих заданному имени. Реализация метода, предлагаемая по умолчанию классом ClassLoader, возвращает объект Enumeration с нулевым числом ресурсов. public Java.net.URL findResource(String name) Возвращает объект java.net.URL для ресурса с заданным именем либо null, если таковой не найден. Если существует несколько ресурсов, отвечающих заданному имени, правила выбора одного из них определяются конкретной реализацией. Реализация метода, предлагаемая по умолчанию классом Class Loader, возвращает значение null.

Слайд 9





Аннотации в Java
Аннотации представляют собой некие метаданные, которые могут добавляться в исходный код программы и семантически не влияют на нее, но могут использоваться в процессе анализа кода, компиляции и даже во время выполнения. 
Основные варианты использования аннотаций: 
предоставлять необходимую информацию для компилятора; 
предоставлять метаданные различным инструментам для генерации кода, конфигураций и т.д.; 
использоваться в коде во время выполнения програмного кода (reflection).
Описание слайда:
Аннотации в Java Аннотации представляют собой некие метаданные, которые могут добавляться в исходный код программы и семантически не влияют на нее, но могут использоваться в процессе анализа кода, компиляции и даже во время выполнения. Основные варианты использования аннотаций: предоставлять необходимую информацию для компилятора; предоставлять метаданные различным инструментам для генерации кода, конфигураций и т.д.; использоваться в коде во время выполнения програмного кода (reflection).

Слайд 10





Аннотации могут быть применены, например, к декларациям классов, полей, методов, и других аннотаций.
Аннотации могут быть применены, например, к декларациям классов, полей, методов, и других аннотаций.
Для описания новой аннотации используется ключевое слово @interface. 
Пример аннотации: 
public @interface Description {
  String title();
  int version() default 1;
  String text();
}
Пример использования аннотации имеет вид:
Описание слайда:
Аннотации могут быть применены, например, к декларациям классов, полей, методов, и других аннотаций. Аннотации могут быть применены, например, к декларациям классов, полей, методов, и других аннотаций. Для описания новой аннотации используется ключевое слово @interface. Пример аннотации: public @interface Description {   String title(); int version() default 1; String text(); } Пример использования аннотации имеет вид:

Слайд 11





@Description(title="title", version=2,  text="text")
@Description(title="title", version=2,  text="text")
 public class Clazz { /* */ }
В качестве типов у элементов аннотации могут использоваться только примитивные типы, перечисления и класс String. 
В случае, когда аннотация указывается для другой аннотации, первую называют мета-аннотацией (meta-annotation type) (Одна из наиболее распространенных мета аннотаций является Retention). 
Она показывает, как долго необходимо хранить аннотацию и инициализируется одним из трех значений:
Описание слайда:
@Description(title="title", version=2, text="text") @Description(title="title", version=2, text="text") public class Clazz { /* */ } В качестве типов у элементов аннотации могут использоваться только примитивные типы, перечисления и класс String. В случае, когда аннотация указывается для другой аннотации, первую называют мета-аннотацией (meta-annotation type) (Одна из наиболее распространенных мета аннотаций является Retention). Она показывает, как долго необходимо хранить аннотацию и инициализируется одним из трех значений:

Слайд 12





RetentionPolicy.SOURCE - аннотация используется на этапе компиляции и должна отбрасываться компилятором; 
RetentionPolicy.SOURCE - аннотация используется на этапе компиляции и должна отбрасываться компилятором; 
RetentionPolicy.CLASS - аннотация будет записана в class-файл компилятором, но не должна быть доступна во время выполнения (runtime); 
RetentionPolicy.RUNTIME - аннотация будет записана в class-файл и доступна во время выполнения через reflection.
Описание слайда:
RetentionPolicy.SOURCE - аннотация используется на этапе компиляции и должна отбрасываться компилятором; RetentionPolicy.SOURCE - аннотация используется на этапе компиляции и должна отбрасываться компилятором; RetentionPolicy.CLASS - аннотация будет записана в class-файл компилятором, но не должна быть доступна во время выполнения (runtime); RetentionPolicy.RUNTIME - аннотация будет записана в class-файл и доступна во время выполнения через reflection.

Слайд 13





По умолчанию у всех аннотаций стоит RetentionPolicy.CLASS. 
По умолчанию у всех аннотаций стоит RetentionPolicy.CLASS. 
Рассмотрим пример аннотации. 
Предположим, необходимо ограничить доступ к некоторым функциям веб-приложения для разных пользователей. 
Иными словами необходимо реализовать права (permissions). 
Для этого можно добавить следующее перечисление в класс пользователя:
Описание слайда:
По умолчанию у всех аннотаций стоит RetentionPolicy.CLASS. По умолчанию у всех аннотаций стоит RetentionPolicy.CLASS. Рассмотрим пример аннотации. Предположим, необходимо ограничить доступ к некоторым функциям веб-приложения для разных пользователей. Иными словами необходимо реализовать права (permissions). Для этого можно добавить следующее перечисление в класс пользователя:

Слайд 14





public class User {
 public static enum Permission {
       USER_MANAGEMENT,
public class User {
 public static enum Permission {
       USER_MANAGEMENT,
          CONTENT_MANAGEMENT 
    }
 private List permissions;
 public List getPermissions() {
       return new ArrayList(permissions);
    }
    ...
}
Создадим аннотацию, которую затем можно использовать для проверки прав:
Описание слайда:
public class User {  public static enum Permission {        USER_MANAGEMENT, public class User {  public static enum Permission {        USER_MANAGEMENT, CONTENT_MANAGEMENT }  private List permissions;  public List getPermissions() {    return new ArrayList(permissions);     }     ... } Создадим аннотацию, которую затем можно использовать для проверки прав:

Слайд 15





@Retention(RetentionPolicy.RUNTIME)
public @interface PermissionRequired {
    User.Permission value();
@Retention(RetentionPolicy.RUNTIME)
public @interface PermissionRequired {
    User.Permission value();
   }
Предположим имеется некоторое действие, право на выполнение которого нужно ограничить, например, UserDeleteAction. 
То добавляем аннотацию на это действие следующим образом: 
@PermissionRequired(
                     User.Permission.USER_MANAGEMENT)
public class UserDeleteAction {
      public void invoke(User user) { …. }
}
Описание слайда:
@Retention(RetentionPolicy.RUNTIME) public @interface PermissionRequired {     User.Permission value(); @Retention(RetentionPolicy.RUNTIME) public @interface PermissionRequired {     User.Permission value(); } Предположим имеется некоторое действие, право на выполнение которого нужно ограничить, например, UserDeleteAction. То добавляем аннотацию на это действие следующим образом: @PermissionRequired( User.Permission.USER_MANAGEMENT) public class UserDeleteAction {     public void invoke(User user) { …. } }

Слайд 16





Теперь используя reflection можно принимать решение, разрешать или не разрешать выполнение определенного действия: 
Теперь используя reflection можно принимать решение, разрешать или не разрешать выполнение определенного действия: 

User user = ...;
Class<?> actionClass = ...;
PermissionRequired permissionRequired = 
           actionClass.getAnnotation(PermissionRequired.class);
if (permissionRequired != null)
   if (user != null && user.getPermissions().contains(
                                                    permissionRequired.value()) ){
    // выполнить действие
       }
Описание слайда:
Теперь используя reflection можно принимать решение, разрешать или не разрешать выполнение определенного действия: Теперь используя reflection можно принимать решение, разрешать или не разрешать выполнение определенного действия: User user = ...; Class<?> actionClass = ...; PermissionRequired permissionRequired = actionClass.getAnnotation(PermissionRequired.class); if (permissionRequired != null)    if (user != null && user.getPermissions().contains( permissionRequired.value()) ){ // выполнить действие }

Слайд 17





Рассмотрим другой пример:
Рассмотрим другой пример:
import java.lang.annotation.*;
import java.lang.reflect.Method;

enum Condition {TRUE, FALSE }

@Retention(RetentionPolicy.RUNTIME)
@interface Cond {
        Condition value();
 }
@Cond(Condition.TRUE)
class Myclass {
     public void func() { System.out.println("Hello");}}

public class Main {
      public static void main(String[] args)throws Exception {
               Myclass m=new Myclass();
              Class<?> cl= Myclass.class;
              Cond cd=cl.getAnnotation(Cond.class);
              System.out.println(cd.value());  //На экране true
       } 
}
Описание слайда:
Рассмотрим другой пример: Рассмотрим другой пример: import java.lang.annotation.*; import java.lang.reflect.Method; enum Condition {TRUE, FALSE } @Retention(RetentionPolicy.RUNTIME) @interface Cond { Condition value(); } @Cond(Condition.TRUE) class Myclass { public void func() { System.out.println("Hello");}} public class Main { public static void main(String[] args)throws Exception { Myclass m=new Myclass(); Class<?> cl= Myclass.class; Cond cd=cl.getAnnotation(Cond.class); System.out.println(cd.value()); //На экране true } }

Слайд 18





Пример. 
Пример. 
Аннотация у метода. 
Аннотация RequestForCustomer сопровождает объявление метода
…………………………………..
@RequestForCustomer (
   level = 2,
   description = "Enable time",
   date = "10/10/2007"
)
public void customerThroughTime () {
  ...
}
Описание слайда:
Пример. Пример. Аннотация у метода. Аннотация RequestForCustomer сопровождает объявление метода ………………………………….. @RequestForCustomer ( level = 2, description = "Enable time", date = "10/10/2007" ) public void customerThroughTime () { ... }

Слайд 19





import java.lang.reflect.Method;
import java.lang.reflect.Method;
public class Request {
@RequestForCustomer (level = 2, description = "Enabletime", 
                                                                               date = "10/10/2007“ )
public void customerThroughTime () {
  try {
     Class c = this.getClass();
     Method m = c.getMethod("customerThroughTime");
     RequestForCustomer ann = 
                                    m.getAnnotation(RequestForCustomer.class);
                                                                                //запрос аннотаций
     System.out.println(ann.level() + " " + ann.description () + " "
                                                                                           + ann.date ()); 
  }
  catch (NoSuchMethodException e) {
                System.out.println ("метод не найден");
   } 
}
Описание слайда:
import java.lang.reflect.Method; import java.lang.reflect.Method; public class Request { @RequestForCustomer (level = 2, description = "Enabletime", date = "10/10/2007“ ) public void customerThroughTime () { try { Class c = this.getClass(); Method m = c.getMethod("customerThroughTime"); RequestForCustomer ann = m.getAnnotation(RequestForCustomer.class); //запрос аннотаций System.out.println(ann.level() + " " + ann.description () + " " + ann.date ()); } catch (NoSuchMethodException e) { System.out.println ("метод не найден"); } }

Слайд 20





Сериализация
Сериализация
Сериализация это процесс сохранения состояния объекта в последовательность байт; десериализация это процесс восстановления объекта, из этих байт. 
Если двум компонентам Java необходимо общаться друг с другом, то им необходим механизм для обмена данными. Есть несколько способов реализовать этот механизм. 
Первый способ это разработать собственный протокол и передать объект. 
   Это означает, что получатель должен знать протокол, используемый отправителем для воссоздания объекта, что усложняет разработку сторонних компонентов. 
Необходим универсальный и эффективный протокол передачи объектов между компонентами. 
   Сериализация создана для этого, и компоненты Java используют этот протокол для передачи объектов.
Описание слайда:
Сериализация Сериализация Сериализация это процесс сохранения состояния объекта в последовательность байт; десериализация это процесс восстановления объекта, из этих байт. Если двум компонентам Java необходимо общаться друг с другом, то им необходим механизм для обмена данными. Есть несколько способов реализовать этот механизм. Первый способ это разработать собственный протокол и передать объект. Это означает, что получатель должен знать протокол, используемый отправителем для воссоздания объекта, что усложняет разработку сторонних компонентов. Необходим универсальный и эффективный протокол передачи объектов между компонентами. Сериализация создана для этого, и компоненты Java используют этот протокол для передачи объектов.

Слайд 21





Сериализация объектов в Java
Сериализация объектов в Java
Класс сериализуемого объекта должен реализовать интерфейс java.io.Serializable:
import java.io.Serializable;
сlass TestSerial implements Serializable {
  public byte version = 100;
  public byte count = 0; 
}
Интерфейс Serializable это интерфейс-маркер; в нём не задекларировано ни одного метода.
Он говорит сериализующему механизму, что класс может быть сериализован.
Описание слайда:
Сериализация объектов в Java Сериализация объектов в Java Класс сериализуемого объекта должен реализовать интерфейс java.io.Serializable: import java.io.Serializable; сlass TestSerial implements Serializable {   public byte version = 100;   public byte count = 0; } Интерфейс Serializable это интерфейс-маркер; в нём не задекларировано ни одного метода. Он говорит сериализующему механизму, что класс может быть сериализован.

Слайд 22





Сериализация делается вызовом метода
Сериализация делается вызовом метода
 writeObject() класса java.io.ObjectOutputStream
Рассмотрим пример:
public static void main(String args[]) 
                                                        throws IOException {
    FileOutputStream fos = 
                                  new FileOutputStream("temp.out");
    ObjectOutputStream oos = 
                                          new ObjectOutputStream(fos);
    TestSerial ts = new TestSerial();
 oos.writeObject(ts);
 oos.flush();
 oos.close();
}
Описание слайда:
Сериализация делается вызовом метода Сериализация делается вызовом метода writeObject() класса java.io.ObjectOutputStream Рассмотрим пример: public static void main(String args[]) throws IOException { FileOutputStream fos = new FileOutputStream("temp.out"); ObjectOutputStream oos = new ObjectOutputStream(fos); TestSerial ts = new TestSerial(); oos.writeObject(ts); oos.flush(); oos.close(); }

Слайд 23





Воссоздать объект из файла можно следующим образом:
Воссоздать объект из файла можно следующим образом:
public static void main(String args[]) throws
                IOException,ClassNotFoundException {
    FileInputStream fis = 
                           new FileInputStream("temp.out");
    ObjectInputStream oin = 
                                    new ObjectInputStream(fis);
 TestSerial ts = (TestSerial) oin.readObject();
 System.out.println("version="+ts.version);
}
Описание слайда:
Воссоздать объект из файла можно следующим образом: Воссоздать объект из файла можно следующим образом: public static void main(String args[]) throws IOException,ClassNotFoundException { FileInputStream fis = new FileInputStream("temp.out"); ObjectInputStream oin = new ObjectInputStream(fis);  TestSerial ts = (TestSerial) oin.readObject();  System.out.println("version="+ts.version); }

Слайд 24





Восстановление объекта происходит с помощью вызова метода oin.readObject(). 
Восстановление объекта происходит с помощью вызова метода oin.readObject(). 
В методе происходит чтение набора байт из файла и создание точной копии графа оригинального объекта. oin.readObject() может прочитать любой сериализованный объект, поэтому необходимо полученный объект приводить к конкретному типу.
Подготовка классов к сериализации
По умолчанию процесс сериализации заключается в сериализации каждого поля объекта, которое не обозначено как transient или static, также данный процесс предполагает, что все поля-объекты, подлежащие сериализации, должны указывать на типы, в свою очередь поддерживающие возможность сериализации.
Описание слайда:
Восстановление объекта происходит с помощью вызова метода oin.readObject(). Восстановление объекта происходит с помощью вызова метода oin.readObject(). В методе происходит чтение набора байт из файла и создание точной копии графа оригинального объекта. oin.readObject() может прочитать любой сериализованный объект, поэтому необходимо полученный объект приводить к конкретному типу. Подготовка классов к сериализации По умолчанию процесс сериализации заключается в сериализации каждого поля объекта, которое не обозначено как transient или static, также данный процесс предполагает, что все поля-объекты, подлежащие сериализации, должны указывать на типы, в свою очередь поддерживающие возможность сериализации.

Слайд 25





Кроме того, требуется, чтобы класс, базовый по отношению к рассматриваемому, либо обладал конструктором без параметров (дабы таковой мог быть вызван в процессе десериализации), либо сам в свою очередь обеспечивал реализацию интерфейса Serializable (в таком случае реализация того же интерфейса в производном классе будет избыточным решением).
Кроме того, требуется, чтобы класс, базовый по отношению к рассматриваемому, либо обладал конструктором без параметров (дабы таковой мог быть вызван в процессе десериализации), либо сам в свою очередь обеспечивал реализацию интерфейса Serializable (в таком случае реализация того же интерфейса в производном классе будет избыточным решением).
Рассмотрим пример:
Описание слайда:
Кроме того, требуется, чтобы класс, базовый по отношению к рассматриваемому, либо обладал конструктором без параметров (дабы таковой мог быть вызван в процессе десериализации), либо сам в свою очередь обеспечивал реализацию интерфейса Serializable (в таком случае реализация того же интерфейса в производном классе будет избыточным решением). Кроме того, требуется, чтобы класс, базовый по отношению к рассматриваемому, либо обладал конструктором без параметров (дабы таковой мог быть вызван в процессе десериализации), либо сам в свою очередь обеспечивал реализацию интерфейса Serializable (в таком случае реализация того же интерфейса в производном классе будет избыточным решением). Рассмотрим пример:

Слайд 26





public class Name implements Serializable { 
public class Name implements Serializable { 
     private String name;  
     private long id;
     private transient boolean hashSet = false;
     private transient int hash;
     private static long nextiD = 0;
  public Name(String name)   {
     this.name = name;
     synchronized(Name.class){ id = nextlD++;}
  }
  public int hashCode() { 
     if (hashset==false) {
        hash = name.hashCode() ; 
        hashSet = true;
     }
     return hash;
   }
    ...
}
Описание слайда:
public class Name implements Serializable { public class Name implements Serializable { private String name; private long id; private transient boolean hashSet = false; private transient int hash; private static long nextiD = 0; public Name(String name) { this.name = name; synchronized(Name.class){ id = nextlD++;} } public int hashCode() { if (hashset==false) { hash = name.hashCode() ; hashSet = true; } return hash; } ... }

Слайд 27





Объект класса Name может быть сохранен в потоке ObjectOutputStream и непосредственно, с помощью вызова метода writeObject, и косвенно, если этот объект адресуется из другого объекта, подлежащего сериализации. 
Объект класса Name может быть сохранен в потоке ObjectOutputStream и непосредственно, с помощью вызова метода writeObject, и косвенно, если этот объект адресуется из другого объекта, подлежащего сериализации. 
Содержимое полей name и id выводится в поток; поля nextiD, hashSet и hash,  в процесс сериализации вовлечены не будут, поскольку nextiD объявлено как static, а два других поля обозначены модификатором transient. 
Поле hash содержит хеш-код, который может быть заново пересчитан на основании содержимого name, нет никаких причин расходовать на его сериализацию дополнительные вычислительные ресурсы и время.
Описание слайда:
Объект класса Name может быть сохранен в потоке ObjectOutputStream и непосредственно, с помощью вызова метода writeObject, и косвенно, если этот объект адресуется из другого объекта, подлежащего сериализации. Объект класса Name может быть сохранен в потоке ObjectOutputStream и непосредственно, с помощью вызова метода writeObject, и косвенно, если этот объект адресуется из другого объекта, подлежащего сериализации. Содержимое полей name и id выводится в поток; поля nextiD, hashSet и hash, в процесс сериализации вовлечены не будут, поскольку nextiD объявлено как static, а два других поля обозначены модификатором transient. Поле hash содержит хеш-код, который может быть заново пересчитан на основании содержимого name, нет никаких причин расходовать на его сериализацию дополнительные вычислительные ресурсы и время.

Слайд 28





Схема десериализации, предлагаемая по умолчанию, предусматривает считывание из потока байтовых данных, сохраненных в процессе сериализации. 
Схема десериализации, предлагаемая по умолчанию, предусматривает считывание из потока байтовых данных, сохраненных в процессе сериализации. 
Статические поля класса остаются в неприкосновенности — в ходе загрузки класса будут выполнены все обычные процедуры инициализации, и статические поля получат требуемые исходные значения.
Описание слайда:
Схема десериализации, предлагаемая по умолчанию, предусматривает считывание из потока байтовых данных, сохраненных в процессе сериализации. Схема десериализации, предлагаемая по умолчанию, предусматривает считывание из потока байтовых данных, сохраненных в процессе сериализации. Статические поля класса остаются в неприкосновенности — в ходе загрузки класса будут выполнены все обычные процедуры инициализации, и статические поля получат требуемые исходные значения.

Слайд 29





Каждому полю transient в восстановленном объекте присваивается значение по умолчанию, соответствующее типу этого поля. 
Каждому полю transient в восстановленном объекте присваивается значение по умолчанию, соответствующее типу этого поля. 
При десериализации объекта класса Name полям name и id вновь созданного объекта будут присвоены те же значения, что и в исходном объекте, содержимое статического поля nextiD останется нетронутым, а transient-поля hashSet и hash получат соответствующие значения по умолчанию (false и 0)— если значение hashSet равно false, величина hash будет пересчитана заново
Описание слайда:
Каждому полю transient в восстановленном объекте присваивается значение по умолчанию, соответствующее типу этого поля. Каждому полю transient в восстановленном объекте присваивается значение по умолчанию, соответствующее типу этого поля. При десериализации объекта класса Name полям name и id вновь созданного объекта будут присвоены те же значения, что и в исходном объекте, содержимое статического поля nextiD останется нетронутым, а transient-поля hashSet и hash получат соответствующие значения по умолчанию (false и 0)— если значение hashSet равно false, величина hash будет пересчитана заново

Слайд 30





Любая попытка осуществления сериализации объекта, не поддерживающего эту возможность, приводит к выбрасыванию исключения типа NotSerializableException.
Любая попытка осуществления сериализации объекта, не поддерживающего эту возможность, приводит к выбрасыванию исключения типа NotSerializableException.
Порядок сериализации и десериализации
Сериализация объектов выполняется в нисходящем порядке по древовидной иерархии типов— от первого из классов, поддерживающих интерфейс Serializable, до классов более частных типов.
Рассмотрим следующую иерархию типов
Описание слайда:
Любая попытка осуществления сериализации объекта, не поддерживающего эту возможность, приводит к выбрасыванию исключения типа NotSerializableException. Любая попытка осуществления сериализации объекта, не поддерживающего эту возможность, приводит к выбрасыванию исключения типа NotSerializableException. Порядок сериализации и десериализации Сериализация объектов выполняется в нисходящем порядке по древовидной иерархии типов— от первого из классов, поддерживающих интерфейс Serializable, до классов более частных типов. Рассмотрим следующую иерархию типов

Слайд 31


Подготовка класса к использованию в Java. (Лекция 9), слайд №31
Описание слайда:

Слайд 32





Рассмотрим порядок десериализации для объекта HTTPInput.
Рассмотрим порядок десериализации для объекта HTTPInput.
Поток ObjectlnputStream вначале выделяет память для нового объекта, а затем находит в иерархии типов ближайший из классов, поддерживающий интерфейс Serializable, т.е. URLInput.
Поток вызывает конструктор без параметров для класса, базового по отношению к найденному (ближайшего из числа тех, которые не поддерживают интерфейс Serializable), т.е. InputSource.
Описание слайда:
Рассмотрим порядок десериализации для объекта HTTPInput. Рассмотрим порядок десериализации для объекта HTTPInput. Поток ObjectlnputStream вначале выделяет память для нового объекта, а затем находит в иерархии типов ближайший из классов, поддерживающий интерфейс Serializable, т.е. URLInput. Поток вызывает конструктор без параметров для класса, базового по отношению к найденному (ближайшего из числа тех, которые не поддерживают интерфейс Serializable), т.е. InputSource.

Слайд 33





Примечание. Если должно быть сохранено иное состояние части объекта, относящейся к базовому классу (InputSource), ответственность за сериализацию и десериализацию этого состояния возлагается на URLInput. 
Примечание. Если должно быть сохранено иное состояние части объекта, относящейся к базовому классу (InputSource), ответственность за сериализацию и десериализацию этого состояния возлагается на URLInput. 
Если же базовый класс, не обеспечивающий сериализацию, обладает собственным значимым состоянием, то придется отступить от схемы сериализации, предлагаемой по умолчанию, и осуществить дополнительную настройку ближайшего из классов, поддерживающих механизм сериализации.
Описание слайда:
Примечание. Если должно быть сохранено иное состояние части объекта, относящейся к базовому классу (InputSource), ответственность за сериализацию и десериализацию этого состояния возлагается на URLInput. Примечание. Если должно быть сохранено иное состояние части объекта, относящейся к базовому классу (InputSource), ответственность за сериализацию и десериализацию этого состояния возлагается на URLInput. Если же базовый класс, не обеспечивающий сериализацию, обладает собственным значимым состоянием, то придется отступить от схемы сериализации, предлагаемой по умолчанию, и осуществить дополнительную настройку ближайшего из классов, поддерживающих механизм сериализации.

Слайд 34





3. После того, как ближайший из классов, поддерживающих механизм сериализации, завершает восстановление данных того подмножества полей, которые относятся к базовому классу, он приступает к воссозданию своего собственного состояния, считывая данные из потока.
3. После того, как ближайший из классов, поддерживающих механизм сериализации, завершает восстановление данных того подмножества полей, которые относятся к базовому классу, он приступает к воссозданию своего собственного состояния, считывая данные из потока.
4. Поток ObjectlnputStream осуществляет просмотр иерархии объектов в нисходящем порядке и выполняет десериализацию каждого объекта посредством вызовов readObject.
Описание слайда:
3. После того, как ближайший из классов, поддерживающих механизм сериализации, завершает восстановление данных того подмножества полей, которые относятся к базовому классу, он приступает к воссозданию своего собственного состояния, считывая данные из потока. 3. После того, как ближайший из классов, поддерживающих механизм сериализации, завершает восстановление данных того подмножества полей, которые относятся к базовому классу, он приступает к воссозданию своего собственного состояния, считывая данные из потока. 4. Поток ObjectlnputStream осуществляет просмотр иерархии объектов в нисходящем порядке и выполняет десериализацию каждого объекта посредством вызовов readObject.

Слайд 35





Если в ходе десериализации объекта будут найдены ссылки на другие ранее сериализованные объекты. 
Если в ходе десериализации объекта будут найдены ссылки на другие ранее сериализованные объекты. 
Эти объекты подвергаются десериализации в том порядке, в каком они обнаруживаются.
Так, если бы объект URLInput, скажем, обладал ссылкой на объект HashMap, адресуемая хеш-таблица вместе со всем ее содержимым была бы подвергнута десериализации раньше, чем оставшаяся часть объекта URLInput как такового.
Описание слайда:
Если в ходе десериализации объекта будут найдены ссылки на другие ранее сериализованные объекты. Если в ходе десериализации объекта будут найдены ссылки на другие ранее сериализованные объекты. Эти объекты подвергаются десериализации в том порядке, в каком они обнаруживаются. Так, если бы объект URLInput, скажем, обладал ссылкой на объект HashMap, адресуемая хеш-таблица вместе со всем ее содержимым была бы подвергнута десериализации раньше, чем оставшаяся часть объекта URLInput как такового.

Слайд 36





Прежде чем будут выполнены любые из рассмотренных операций десериализации, соответствующие классы должны быть загружены, в противном случае метод readObject выбросить исключение ClassNotFoundException. 
Прежде чем будут выполнены любые из рассмотренных операций десериализации, соответствующие классы должны быть загружены, в противном случае метод readObject выбросить исключение ClassNotFoundException.
Описание слайда:
Прежде чем будут выполнены любые из рассмотренных операций десериализации, соответствующие классы должны быть загружены, в противном случае метод readObject выбросить исключение ClassNotFoundException. Прежде чем будут выполнены любые из рассмотренных операций десериализации, соответствующие классы должны быть загружены, в противном случае метод readObject выбросить исключение ClassNotFoundException.

Слайд 37





Настройка механизма сериализации
Настройка механизма сериализации
Для некоторых классов обычные средства десериализации могут оказаться неадекватными или неэффективными. 
В этом случае необходимо переопределить методы readObject и writeObject. 
Подобные переопределенные варианты методов writeObject и readObject вызываются только в контексте объектов соответствующих классов, и методы несут ответственность исключительно за состояние объекта класса как такового, в том числе и в части, унаследованной от базового класса, не поддерживающего механизм сериализации. 
Если в составе класса реализованы собственные варианты методов writeObject и readObject, они не должны обращаться к одноименным методам базового класса.
Описание слайда:
Настройка механизма сериализации Настройка механизма сериализации Для некоторых классов обычные средства десериализации могут оказаться неадекватными или неэффективными. В этом случае необходимо переопределить методы readObject и writeObject. Подобные переопределенные варианты методов writeObject и readObject вызываются только в контексте объектов соответствующих классов, и методы несут ответственность исключительно за состояние объекта класса как такового, в том числе и в части, унаследованной от базового класса, не поддерживающего механизм сериализации. Если в составе класса реализованы собственные варианты методов writeObject и readObject, они не должны обращаться к одноименным методам базового класса.

Слайд 38





В качестве примера рассмотрим улучшенный вариант класса Name
В качестве примера рассмотрим улучшенный вариант класса Name
public class BetterName implements Serializable { 
    private String name; 
    private long id; 
    private transient int hash;
    private static long nextlD = 0;
  public BetterName(String name)  { 
       this.name = name; 
       synchronized  (BetterName.class)  { 
                id = nextlD++;
       }
       hash = name.hashCode(); 
  }
Описание слайда:
В качестве примера рассмотрим улучшенный вариант класса Name В качестве примера рассмотрим улучшенный вариант класса Name public class BetterName implements Serializable { private String name; private long id; private transient int hash; private static long nextlD = 0; public BetterName(String name) { this.name = name; synchronized (BetterName.class) { id = nextlD++; } hash = name.hashCode(); }

Слайд 39





  private void writeObject(ObjectOutputStream out)
  private void writeObject(ObjectOutputStream out)
                                                    throws lOException {  
     out.writeUTF(name); 
     out.writeLong(id); 
  }
  private void readObject(ObjectlnputStream in)
         throws lOException, ClassNotFoundException{
     name = in.readUTF(); 
     id = in. readLong() ;
     hash = name.hashCode(); 
  }
  ……
}
Описание слайда:
private void writeObject(ObjectOutputStream out) private void writeObject(ObjectOutputStream out) throws lOException { out.writeUTF(name); out.writeLong(id); } private void readObject(ObjectlnputStream in) throws lOException, ClassNotFoundException{ name = in.readUTF(); id = in. readLong() ; hash = name.hashCode(); } …… }

Слайд 40





Существует ограничение: приступая к настройке механизма сериализации, нельзя присваивать значение полю final в теле метода readObject, поскольку поля final могут быть проинициализированы только в блоках инициализации или конструкторах. 
Существует ограничение: приступая к настройке механизма сериализации, нельзя присваивать значение полю final в теле метода readObject, поскольку поля final могут быть проинициализированы только в блоках инициализации или конструкторах. 
Переопределенные методы readObject и writeObject обязательно должны быть private.
Описание слайда:
Существует ограничение: приступая к настройке механизма сериализации, нельзя присваивать значение полю final в теле метода readObject, поскольку поля final могут быть проинициализированы только в блоках инициализации или конструкторах. Существует ограничение: приступая к настройке механизма сериализации, нельзя присваивать значение полю final в теле метода readObject, поскольку поля final могут быть проинициализированы только в блоках инициализации или конструкторах. Переопределенные методы readObject и writeObject обязательно должны быть private.

Слайд 41





Контроль версий объектов
Контроль версий объектов
Если реализация классов может быть изменена в промежутке времени между сериализацией и десериализацией объекта  класса, то поток ObjectInputStream способен обнаружить факт внесения изменений.
При сохранении объекта вместе с ним записывается уникальный идентификатор номера версии (serial version unique identifier, UID), 64-битовое значение типа long.
Описание слайда:
Контроль версий объектов Контроль версий объектов Если реализация классов может быть изменена в промежутке времени между сериализацией и десериализацией объекта класса, то поток ObjectInputStream способен обнаружить факт внесения изменений. При сохранении объекта вместе с ним записывается уникальный идентификатор номера версии (serial version unique identifier, UID), 64-битовое значение типа long.

Слайд 42





По умолчанию идентификатор создается в виде хеш-кода, построенного на основе информации об именах класса, его членов и базовых интерфейсов; изменение таких данных служит сигналом о возможной несовместимости версий класса.
По умолчанию идентификатор создается в виде хеш-кода, построенного на основе информации об именах класса, его членов и базовых интерфейсов; изменение таких данных служит сигналом о возможной несовместимости версий класса.
При вводе данных об объекте из потока 
ObjectInputStream считывается также и идентификатор номера версии. 
Затем предпринимается попытка загрузки соответствующего класса.
Описание слайда:
По умолчанию идентификатор создается в виде хеш-кода, построенного на основе информации об именах класса, его членов и базовых интерфейсов; изменение таких данных служит сигналом о возможной несовместимости версий класса. По умолчанию идентификатор создается в виде хеш-кода, построенного на основе информации об именах класса, его членов и базовых интерфейсов; изменение таких данных служит сигналом о возможной несовместимости версий класса. При вводе данных об объекте из потока ObjectInputStream считывается также и идентификатор номера версии. Затем предпринимается попытка загрузки соответствующего класса.

Слайд 43





Если требуемый класс не найден или идентификатор загруженного класса не совпадает с тем, который считан из потока, метод readОbject выбрасывает исключение типа InvalidClassException. 
Если требуемый класс не найден или идентификатор загруженного класса не совпадает с тем, который считан из потока, метод readОbject выбрасывает исключение типа InvalidClassException. 
Если успешно загружены все нужные классы и выявлено совпадение всех идентификаторов, объект  может быть подвергнут десериализации.
Существует возможность сохранить совместимость класса, снабженного дополнительными несущественными нововведениями, с данными ранее сериализованных объектов. 
Для этого следует принудительно объявить в составе класса специальное поле, содержащее значение идентификатора номера версии, например:
private static final long
               serialversionUlD = 1307795172754062330L;
Описание слайда:
Если требуемый класс не найден или идентификатор загруженного класса не совпадает с тем, который считан из потока, метод readОbject выбрасывает исключение типа InvalidClassException. Если требуемый класс не найден или идентификатор загруженного класса не совпадает с тем, который считан из потока, метод readОbject выбрасывает исключение типа InvalidClassException. Если успешно загружены все нужные классы и выявлено совпадение всех идентификаторов, объект может быть подвергнут десериализации. Существует возможность сохранить совместимость класса, снабженного дополнительными несущественными нововведениями, с данными ранее сериализованных объектов. Для этого следует принудительно объявить в составе класса специальное поле, содержащее значение идентификатора номера версии, например: private static final long serialversionUlD = 1307795172754062330L;

Слайд 44





Рассмотрим пример.
Рассмотрим пример.
Пусть изначально имеется класс
public class BetterName implements Serializable { 
    private String name; 
    private long id; 
    private transient int hash;
    private static long nextlD = 1;

   public BetterName(String name){ 
         this.name = name; 
         synchronized  (BetterName.class)  { 
             id = nextlD++;
         }
         hash = name.hashCode(); }
}
Описание слайда:
Рассмотрим пример. Рассмотрим пример. Пусть изначально имеется класс public class BetterName implements Serializable { private String name; private long id; private transient int hash; private static long nextlD = 1; public BetterName(String name){ this.name = name; synchronized (BetterName.class) { id = nextlD++; } hash = name.hashCode(); } }

Слайд 45





Используя следущий код сереализируем данный класс
Используя следущий код сереализируем данный класс

public static void main(String args[])throws IOException{
   FileOutputStream fos = new FileOutputStream("temp.out");
   ObjectOutputStream oos = new ObjectOutputStream(fos);
    BetterName ts = new BetterName (“aaaa”);
oos.writeObject(ts);
oos.flush();
oos.close();
}
Описание слайда:
Используя следущий код сереализируем данный класс Используя следущий код сереализируем данный класс public static void main(String args[])throws IOException{ FileOutputStream fos = new FileOutputStream("temp.out"); ObjectOutputStream oos = new ObjectOutputStream(fos); BetterName ts = new BetterName (“aaaa”); oos.writeObject(ts); oos.flush(); oos.close(); }

Слайд 46





Предположим, что перед десериализацией код класса BetterName был изменен
Предположим, что перед десериализацией код класса BetterName был изменен
public class BetterName implements Serializable { 
    private String name; 
    private long id; 
    private transient int hash;
    private static long nextlD = 1;
    private int a=20; 

   public BetterName(String name)  { 
       this.name = name; 
       this.a=20;  

        synchronized(BetterName.class){ id = nextlD++;}
        hash = name.hashCode(); 
   }
}
Описание слайда:
Предположим, что перед десериализацией код класса BetterName был изменен Предположим, что перед десериализацией код класса BetterName был изменен public class BetterName implements Serializable { private String name; private long id; private transient int hash; private static long nextlD = 1; private int a=20; public BetterName(String name) { this.name = name; this.a=20; synchronized(BetterName.class){ id = nextlD++;} hash = name.hashCode(); } }

Слайд 47





Если данный класс десериализировать с помощью кода
Если данный класс десериализировать с помощью кода
public static void main(String args[]) 
                       throws IOException,ClassNotFoundException{
   FileInputStream fis = new FileInputStream("temp.out");
   ObjectInputStream oin = new  ObjectInputStream(fis);
   BetterName ts = (BetterName) oin.readObject();
}
то будет выброшено исключение, которое связано с тем, что не совпадает serialversionUlD сериализированного объекта и новой версии класса BetterName.
Описание слайда:
Если данный класс десериализировать с помощью кода Если данный класс десериализировать с помощью кода public static void main(String args[]) throws IOException,ClassNotFoundException{ FileInputStream fis = new FileInputStream("temp.out"); ObjectInputStream oin = new ObjectInputStream(fis); BetterName ts = (BetterName) oin.readObject(); } то будет выброшено исключение, которое связано с тем, что не совпадает serialversionUlD сериализированного объекта и новой версии класса BetterName.

Слайд 48





Чтобы избежать выброса исключения необходимо добавить в код класса BetterName поле serialversionUlD
Чтобы избежать выброса исключения необходимо добавить в код класса BetterName поле serialversionUlD
public class BetterName implements Serializable { 
    private String name; 
    private long id; 
    private transient int hash;
    private static long nextlD = 1;
    private int a=20; 
    static final long serialVersionUID = 
                                                       4090868775906377719L;
    …………………
}
Описание слайда:
Чтобы избежать выброса исключения необходимо добавить в код класса BetterName поле serialversionUlD Чтобы избежать выброса исключения необходимо добавить в код класса BetterName поле serialversionUlD public class BetterName implements Serializable { private String name; private long id; private transient int hash; private static long nextlD = 1; private int a=20; static final long serialVersionUID = 4090868775906377719L; ………………… }

Слайд 49





Получить значение поля serialVersionUID можно с помощью утилиты serialver, она находится там же, где и javac:
Получить значение поля serialVersionUID можно с помощью утилиты serialver, она находится там же, где и javac:
>> serialver BetterName
Эту утилиту нужно запустить перед изменением класса BetterName.
Описание слайда:
Получить значение поля serialVersionUID можно с помощью утилиты serialver, она находится там же, где и javac: Получить значение поля serialVersionUID можно с помощью утилиты serialver, она находится там же, где и javac: >> serialver BetterName Эту утилиту нужно запустить перед изменением класса BetterName.

Слайд 50





Интерфейс Externalizable
Интерфейс Externalizable
Интерфейс Externalizable является производным от Serializable. 
Класс, реализующий интерфейс Externalizable, приобретает все полномочия по управлению состоянием объекта, подлежащего сериализации, но при этом несет и сугубую ответственность за корректную обработку данных, относящихся к базовым классам, обеспечение контроля версий и т.д.
Описание слайда:
Интерфейс Externalizable Интерфейс Externalizable Интерфейс Externalizable является производным от Serializable. Класс, реализующий интерфейс Externalizable, приобретает все полномочия по управлению состоянием объекта, подлежащего сериализации, но при этом несет и сугубую ответственность за корректную обработку данных, относящихся к базовым классам, обеспечение контроля версий и т.д.

Слайд 51





Подобная возможность необходима, например, в условиях, когда при реализации хранилища данных об объектах следует учесть некие особые ограничения, касающиеся формы представления объектов и не совместимые с существующими механизмами сериализации.
Подобная возможность необходима, например, в условиях, когда при реализации хранилища данных об объектах следует учесть некие особые ограничения, касающиеся формы представления объектов и не совместимые с существующими механизмами сериализации.
В составе интерфейса Externalizable определены два метода: 
public interface Externalizable extends Serializable { 
    void writeExternal(ObjectOutput out) throws lOException; 
    void  readExternal(Objectlnput in)
                         throws lOException, ClassNotFoundException;
}
Описание слайда:
Подобная возможность необходима, например, в условиях, когда при реализации хранилища данных об объектах следует учесть некие особые ограничения, касающиеся формы представления объектов и не совместимые с существующими механизмами сериализации. Подобная возможность необходима, например, в условиях, когда при реализации хранилища данных об объектах следует учесть некие особые ограничения, касающиеся формы представления объектов и не совместимые с существующими механизмами сериализации. В составе интерфейса Externalizable определены два метода: public interface Externalizable extends Serializable { void writeExternal(ObjectOutput out) throws lOException; void  readExternal(Objectlnput in) throws lOException, ClassNotFoundException; }

Слайд 52





Методы вызываются в процессе сериализации и десериализации объекта соответственно. Это обычные методы public, и выбор требуемой реализации каждого из них определяется типом текущего объекта.
Методы вызываются в процессе сериализации и десериализации объекта соответственно. Это обычные методы public, и выбор требуемой реализации каждого из них определяется типом текущего объекта.
Классам, производным от класса, реализующего интерфейс Externalizable, часто необходимо вызвать соответствующий метод базового класса прежде, чем будет осуществлена сериализация или десериализация их собственного состояния, — в отличие от классов, реализующих схему сериализации, принятую по умолчанию.
Описание слайда:
Методы вызываются в процессе сериализации и десериализации объекта соответственно. Это обычные методы public, и выбор требуемой реализации каждого из них определяется типом текущего объекта. Методы вызываются в процессе сериализации и десериализации объекта соответственно. Это обычные методы public, и выбор требуемой реализации каждого из них определяется типом текущего объекта. Классам, производным от класса, реализующего интерфейс Externalizable, часто необходимо вызвать соответствующий метод базового класса прежде, чем будет осуществлена сериализация или десериализация их собственного состояния, — в отличие от классов, реализующих схему сериализации, принятую по умолчанию.

Слайд 53





Рассмотрим пример:
Рассмотрим пример:
import java.io.Externalizable;
import java.io.ObjectOutput;
import java.io.IOException;
import java.io.ObjectInput;
public class ItemExt implements Externalizable{

    private int fieldInt;
    private boolean fieldBoolean;
    private long fieldLong;
    private float fieldFloat;
    private double fieldDouble;
    private String fieldString;

    public ItemExt(){
        this(0,true,0,0,0,"");
    }
Описание слайда:
Рассмотрим пример: Рассмотрим пример: import java.io.Externalizable; import java.io.ObjectOutput; import java.io.IOException; import java.io.ObjectInput; public class ItemExt implements Externalizable{ private int fieldInt; private boolean fieldBoolean; private long fieldLong; private float fieldFloat; private double fieldDouble; private String fieldString; public ItemExt(){ this(0,true,0,0,0,""); }

Слайд 54





public ItemExt(int fieldInt, 
public ItemExt(int fieldInt, 
                   boolean fieldBoolean,
                   long fieldLong,
                   float fieldFloat,
                   double fieldDouble,
                   String fieldString) {
       
        this.fieldInt = fieldInt;
        this.fieldBoolean = fieldBoolean;
        this.fieldLong = fieldLong;
        this.fieldFloat = fieldFloat;
        this.fieldDouble = fieldDouble;
        this.fieldString = fieldString;
}
Описание слайда:
public ItemExt(int fieldInt, public ItemExt(int fieldInt, boolean fieldBoolean, long fieldLong, float fieldFloat, double fieldDouble, String fieldString) { this.fieldInt = fieldInt; this.fieldBoolean = fieldBoolean; this.fieldLong = fieldLong; this.fieldFloat = fieldFloat; this.fieldDouble = fieldDouble; this.fieldString = fieldString; }

Слайд 55





public int getFieldInt() {  return fieldInt;  }
public int getFieldInt() {  return fieldInt;  }

public boolean getFieldBoolean() { 
       return fieldBoolean; 
}
public long getFieldLong() { return fieldLong;}

public float getFieldFloat() {return fieldFloat; }

public double getFieldDouble() {
       return fieldDouble; 
}
public String getFieldString() {
      return fieldString;
}
Описание слайда:
public int getFieldInt() { return fieldInt; } public int getFieldInt() { return fieldInt; } public boolean getFieldBoolean() { return fieldBoolean; } public long getFieldLong() { return fieldLong;} public float getFieldFloat() {return fieldFloat; } public double getFieldDouble() { return fieldDouble; } public String getFieldString() { return fieldString; }

Слайд 56





public void writeExternal(ObjectOutput out)
public void writeExternal(ObjectOutput out)
                                          throws IOException{
        out.writeInt(fieldInt);
        out.writeBoolean(fieldBoolean);
        out.writeLong(fieldLong);
        out.writeFloat(fieldFloat);
        out.writeDouble(fieldDouble);
        out.writeUTF(fieldString);
}
Описание слайда:
public void writeExternal(ObjectOutput out) public void writeExternal(ObjectOutput out) throws IOException{ out.writeInt(fieldInt); out.writeBoolean(fieldBoolean); out.writeLong(fieldLong); out.writeFloat(fieldFloat); out.writeDouble(fieldDouble); out.writeUTF(fieldString); }

Слайд 57





public void readExternal(ObjectInput in) 
public void readExternal(ObjectInput in) 
                throws IOException, ClassNotFoundException{
        
        fieldInt = in.readInt();
        fieldBoolean = in.readBoolean();
        fieldLong = in.readLong();
        fieldFloat = in.readFloat();
        fieldDouble = in.readDouble();
        fieldString = in.readUTF();
    }
}
Описание слайда:
public void readExternal(ObjectInput in) public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException{ fieldInt = in.readInt(); fieldBoolean = in.readBoolean(); fieldLong = in.readLong(); fieldFloat = in.readFloat(); fieldDouble = in.readDouble(); fieldString = in.readUTF(); } }

Слайд 58





Тогда сериализация класса ItemExt будет иметь вид:
Тогда сериализация класса ItemExt будет иметь вид:
public static void main(String[] args)throws IOException{
   
   FileOutputStream fos = new FileOutputStream("temp.out");
   ObjectOutputStream oos = new ObjectOutputStream(fos);
   ItemExt ts = new ItemExt();
   oos.writeObject(ts);
   oos.flush();
   oos.close();
}
Описание слайда:
Тогда сериализация класса ItemExt будет иметь вид: Тогда сериализация класса ItemExt будет иметь вид: public static void main(String[] args)throws IOException{ FileOutputStream fos = new FileOutputStream("temp.out"); ObjectOutputStream oos = new ObjectOutputStream(fos); ItemExt ts = new ItemExt(); oos.writeObject(ts); oos.flush(); oos.close(); }

Слайд 59





Соответственно десериализация имеет вид:
Соответственно десериализация имеет вид:
public static void main(String[] args)
                throws IOException,ClassNotFoundException {
   
   FileInputStream fis = new FileInputStream("temp.out");
   ObjectInputStream oin = new ObjectInputStream(fis);
   ItemExt ts = (ItemExt) oin.readObject();
   System.out.println(ts.getFieldInt());
}
Описание слайда:
Соответственно десериализация имеет вид: Соответственно десериализация имеет вид: public static void main(String[] args) throws IOException,ClassNotFoundException { FileInputStream fis = new FileInputStream("temp.out"); ObjectInputStream oin = new ObjectInputStream(fis); ItemExt ts = (ItemExt) oin.readObject(); System.out.println(ts.getFieldInt()); }



Похожие презентации
Mypresentation.ru
Загрузить презентацию