Successfully reported this slideshow.
Your SlideShare is downloading. ×

Урок 23. Сериализация и клонирование в языке Java.

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad

Check these out next

1 of 29 Ad

Урок 23. Сериализация и клонирование в языке Java.

Download to read offline

Урок 23. Сериализация и клонирование в языке Java.
Лекции, задания, видео, тесты и вопросы на:
https://www.examclouds.com/ru/java/java-core-russian/reflection-api-java-doc
Подписывайтесь на страницу:
https://www.facebook.com/Examclouds
Подписывайтесь на канал
https://www.youtube.com/c/tatyanamilkina

Урок 23. Сериализация и клонирование в языке Java.
Лекции, задания, видео, тесты и вопросы на:
https://www.examclouds.com/ru/java/java-core-russian/reflection-api-java-doc
Подписывайтесь на страницу:
https://www.facebook.com/Examclouds
Подписывайтесь на канал
https://www.youtube.com/c/tatyanamilkina

Advertisement
Advertisement

More Related Content

Slideshows for you (16)

Similar to Урок 23. Сериализация и клонирование в языке Java. (20)

Advertisement

Recently uploaded (15)

Урок 23. Сериализация и клонирование в языке Java.

  1. 1. 1. Сериализация и десериализация 2. Граф исходного объекта 3. Специальные методы 4. Десериализация и наследование 5. Клонирование www.examclouds.com
  2. 2. Что такое сериализация и десериализация  Сериализация - это процесс сохранения состояния объекта в последовательность байт.  Десериализация - это процесс восстановления объекта, из этих байт.  Java Serialization API предоставляет стандартный механизм для создания сериализуемых объектов. www.examclouds.com
  3. 3. Какие поля сериализуются?  Все кроме static или transient. www.examclouds.com
  4. 4. Пример сериализации  Для того, что бы объект мог быть сериализован, он должен реализовать интерфейс Serializable. import java.io.Serializable; public class Cat implements Serializable { private String name; public Cat(String name) { this.name = name; } } www.examclouds.com
  5. 5. Интерфейс java.io.Serializable  Интерфейс java.io.Serializable – это интерфейс-маркер.  Он не определяет никаких методов. Его присутствие только определяет, что объекты этого класса разрешено сериализовывать.  При попытке сериализовать объект, не реализующий этот интерфейс, будет брошено java.io.NotSerializableException. www.examclouds.com
  6. 6. Классы для сериализации  Для работы по сериализации в java.io определены:  интерфейсы ObjectInput, ObjectOutput  и реализующие их классы ObjectInputStream и ObjectOutputStream соответственно. www.examclouds.com
  7. 7. Пример сериализации public class SerializeCat { private static final String FILE_NAME = "testSer.ser"; public static void main(String[] args) { serialize(); Cat cat = deserialize(); } private static Cat deserialize() { Cat cat = null; try (FileInputStream fis = new FileInputStream(FILE_NAME); ObjectInputStream ois = new ObjectInputStream(fis)) { cat = (Cat) ois.readObject(); } catch (IOException | ClassNotFoundException e) { System.out.println(e.getMessage()); } return cat; } private static void serialize() { Cat cat = new Cat("Барсик"); try (FileOutputStream fs = new FileOutputStream(FILE_NAME); ObjectOutputStream os = new ObjectOutputStream(fs)) { os.writeObject(cat); } catch (IOException e) { System.out.println(e.getMessage()); } } } www.examclouds.com
  8. 8. Десериализация  После того, как объект был сериализован (превращен в последовательность байт), его можно восстановить, при этом восстановление можно проводить на любой машине (вне зависимости от того, где проводилась сериализация). www.examclouds.com
  9. 9. Десериализация transient и static  При десериализации поле со спецификатором transient получает значение по умолчанию, соответствующее его типу.  Поле со спецификатором static не изменяется. www.examclouds.com
  10. 10. Десериализация и конструкторы  Десериализация происходит следующим образом: под объект выделяется память, после чего его поля заполняются значениями из потока.  КОНСТРУКТОР объекта при этом НЕ ВЫЗЫВАЕТСЯ. www.examclouds.com
  11. 11. Граф исходного объекта  Сериализуемый объект может хранить ссылки на другие объекты, которые в свою очередь так же могут хранить ссылки на другие объекты.  И все ссылки тоже должны быть восстановлены при десериализации.  Важно, что если несколько ссылок указывают на один и тот же объект, то в восстановленных объектах эти ссылки так же указывали на один и тот же объект. www.examclouds.com
  12. 12. Граф исходного объекта  Чтобы сериализованный объект не был записан дважды, механизм сериализации некоторым образом для себя помечает, что объект уже записан в граф, и когда в очередной раз попадется ссылка на него, она будет указывать на уже сериализованный объект.  Такой механизм необходим, что бы иметь возможность записывать связанные объекты, которые могут иметь перекрестные ссылки. В таких случаях необходимо отслеживать был ли объект уже сериализован, то есть нужно ли его записывать или достаточно указать ссылку на него. www.examclouds.com
  13. 13. Граф исходного объекта  Если класс содержит в качестве полей другие объекты, то эти объекты так же будут сериализовываться и поэтому тоже должны быть сериализуемы. В свою очередь, сериализуемы должны быть и все объекты, содержащиеся в этих сериализуемых объектах и т.д.  Полный путь ссылок объекта по всем объектным ссылкам, имеющимся у него и у всех объектов на которые у него имеются ссылки, и т.д. - называется графом исходного объекта. www.examclouds.com
  14. 14. Пример сериализации графа объектов import java.io.Serializable; public class Dog implements Serializable { private Collar theCollar; public Dog(Collar collar) { theCollar = collar; } public Collar getCollar() { return theCollar; } } import java.io.Serializable; public class Collar implements Serializable { private int collarSize; public Collar(int size) { collarSize = size; } public int getCollarSize() { return collarSize; } } www.examclouds.com
  15. 15. Пример сериализации графа объектов public class SerializeDog { private static final String FILE_NAME = "testSer.ser"; public static void main(String[] args) { Collar collar = new Collar(3); Dog dog1 = new Dog(collar); Dog dog2 = new Dog(collar); serialize(dog1, dog2); Dog[] deserializedDogs = deserialize(2); System.out.println(dog1.equals(deserializedDogs[0])); System.out.println(dog2.equals(deserializedDogs[1])); Collar desCollar1 = deserializedDogs[0].getCollar(); Collar desCollar2 = deserializedDogs[1].getCollar(); System.out.println(desCollar1.equals(desCollar2)); } www.examclouds.com
  16. 16. Пример сериализации графа объектов private static void serialize(Dog... dogs) { try (FileOutputStream fs = new FileOutputStream(FILE_NAME); ObjectOutputStream os = new ObjectOutputStream(fs)) { for (Dog dog : dogs) { os.writeObject(dog); } } catch (IOException e) { System.out.println(e.getMessage()); } } private static Dog[] deserialize(int dogNumber) { Dog[] dogs = new Dog[dogNumber]; try (FileInputStream fs = new FileInputStream(FILE_NAME); ObjectInputStream os = new ObjectInputStream(fs)) { for (int i = 0; i < dogNumber; i++) { dogs[i] = (Dog) os.readObject(); } } catch (IOException | ClassNotFoundException e) { System.out.println(e.getMessage()); } return dogs; } } www.examclouds.com
  17. 17. Модификатор transient  Если по какой-то причине класс не может реализовать интерфейс Serializable, переменная этого класса может быть объявлена как transient. www.examclouds.com
  18. 18. Пример использования transient переменной public class Bird implements Serializable { private String name; private transient Ring ring; public Bird(String name, Ring ring) { this.name = name; this.ring = ring; } public Ring getRing() { return ring; } } public class Ring { private int size; public Ring(int size) { this.size = size; } public int getSize() { return size; } } www.examclouds.com
  19. 19. Пример использования transient переменной public class SerializeBird { private static final String FILE_NAME = "testSer.ser"; public static void main(String[] args) { Ring ring = new Ring(3); Bird bird = new Bird("pigeon", ring); System.out.println("Размер кольца перед сериализацией: " + bird.getRing().getSize()); try (FileOutputStream fs = new FileOutputStream(FILE_NAME); ObjectOutputStream os = new ObjectOutputStream(fs)) { os.writeObject(bird); } catch (IOException e) { System.out.println(e.getMessage()); } try (FileInputStream fis = new FileInputStream("testSer.ser"); ObjectInputStream ois = new ObjectInputStream(fis)) { bird = (Bird) ois.readObject(); } catch (IOException | ClassNotFoundException e) { System.out.println(e.getMessage()); } System.out.println("Размер кольца после сериализации: " + bird.getRing().getSize()); } } www.examclouds.com
  20. 20. Десериализация и наследование  При десериализации производного класса, наследуемого от несериализуемого класса, вызывается конструктор без параметров родительского НЕ сериализуемого класса. И если такого конструктора не будет – при десериализации возникнет ошибка java.io.InvalidClassException. Конструктор же дочернего объекта, того, который мы десериализуем, не вызывается.  В процессе десериализации, поля НЕ сериализуемых классов (родительских классов, НЕ реализующих интерфейс Serializable) инициируются вызовом конструктора без параметров. Такой конструктор должен быть доступен из сериализуемого их подкласса. Поля сериализуемого класса будут восстановлены из потока. www.examclouds.com
  21. 21. Десериализация и наследование public class Insect { private String name; public Insect(String type) { this.name = type; } public Insect() { } public String getName() { return name; } public void setName(String type) { this.name = type; } } public class Bug extends Insect implements Serializable { private boolean fly; public Bug(String type, boolean fly) { super(type); this.fly = fly; } public boolean isFly() { return fly; } public void setFly(boolean fly) { this.fly = fly; } } www.examclouds.com
  22. 22. Десериализация и наследование public class SerializeInsect { private static final String FILE_NAME = "testSer.ser"; public static void main(String[] args) { Bug bug = new Bug("Майский жук", true); System.out.println("До сериализации " + bug); try (FileOutputStream fs = new FileOutputStream(FILE_NAME); ObjectOutputStream os = new ObjectOutputStream(fs)) { os.writeObject(bug); } catch (IOException e) { System.out.println(e.getMessage()); } try (FileInputStream fis = new FileInputStream(FILE_NAME); ObjectInputStream ois = new ObjectInputStream(fis)) { bug = (Bug) ois.readObject(); } catch (IOException | ClassNotFoundException e) { System.out.println(e.getMessage()); } System.out.println("После сериализации " + bug); } } www.examclouds.com
  23. 23. Задание  Создайте метод, который сериализует класс Horse (наследник Animal) в файл и метод, который десериализует его. www.examclouds.com
  24. 24. Клонирование Для клонирования объекта в Java можно пользоваться тремя способами: 1. Переопределение метода clone() и реализация интерфейса Cloneable(). 2. Использование конструктора копирования. 3. Использовать для клонирования механизм сериализации. www.examclouds.com
  25. 25. Переопределение метода clone()  Метод clone() в родительском классе Object является protected, поэтому требуется переопределение его с объявлением как public.  Реализация по умолчанию метода Object.clone() выполняет неполное/поверхностное (shallow) копирование.  Object.clone() выбрасывает исключение CloneNotSupportedException при попытке клонировать объект не реализующий интерфейс Cloneable. www.examclouds.com
  26. 26. Пример поверхностного клонирования public class Car implements Cloneable { private String name; private Driver driver; public Car(String name, Driver driver) { this.name = name; this.driver = driver; } /** * Конструктор копирования. * * @param otherCar */ public Car(Car otherCar) { this(otherCar.getName(), otherCar.getDriver()); } … @Override public Car clone() throws CloneNotSupportedException { return (Car)super.clone(); } } www.examclouds.com
  27. 27. Пример поверхностного клонирования public class CloneCarDemo { public static void main(String[] args) throws CloneNotS Car car = new Car("Грузовик", new Driver("Василий", Car clonedCar = car.clone(); System.out.println("Оригинал:t" + car); System.out.println("Клон: t" + clonedCar); Driver clonedCarDriver = clonedCar.getDriver(); clonedCarDriver.setName("Вася"); System.out.println("Оригинал после изменения имени System.out.println("Клон после изменения имени води } } www.examclouds.com
  28. 28. Пример глубокого клонирования public class Car implements Cloneable { private String name; private Driver driver; /** * Конструктор копирования. * * @param otherCar */ public Car(Car otherCar) throws CloneNotSupportedException { this(otherCar.getName(), otherCar.getDriver().clone()); } … @Override public Car clone() throws CloneNotSupportedException { Car newCar = (Car) super.clone(); Driver driver = this.getDriver().clone(); newCar.setDriver(driver); return newCar; } } www.examclouds.com
  29. 29. Лекции, задания, видео, тесты и вопросы на:  https://www.examclouds.com/ru/java/java-core- russian/lesson19 Подписывайтесь на страницу:  https://www.facebook.com/Examclouds  Подписывайтесь на канал https://www.youtube.com/c/tatyanamilkina www.examclouds.com

×