Главная страница

Ответы на вопросы по ревью 4. Java io. Ключевым понятием здесь является понятие потока


Скачать 1.93 Mb.
НазваниеJava io. Ключевым понятием здесь является понятие потока
Дата03.07.2022
Размер1.93 Mb.
Формат файлаdoc
Имя файлаОтветы на вопросы по ревью 4.doc
ТипДокументы
#623608
страница22 из 39
1   ...   18   19   20   21   22   23   24   25   ...   39

Настройка сериализации и десериализации с помощью методов writeObject и readObject


JVM имеет полный контроль над сериализацией объекта в процессе сериализации по умолчанию, но у процесса сериализации по умолчанию есть много недостатков, некоторые из которых:

  1. Он не может обрабатывать сериализацию полей, которые не являются сериализуемыми.

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

Но мы можем переопределить это поведение сериализации по умолчанию внутри нашего класса Java и предоставить некоторую дополнительную логику для улучшения обычного процесса. Это можно сделать, предоставив два метода writeObject и readObject внутри класса, который мы хотим сериализовать:



// Custom serialization logic will allow us to have additional serialization logic on top of the default one e.g. encrypting object before serialization

private void writeObject(ObjectOutputStream oos) throws IOException {

// Any Custom logic

oos.defaultWriteObject(); // Calling the default serialization logic

// Any Custom logic

}



// Custom deserialization logic will allow us to have additional deserialization logic on top of the default one e.g. decrypting object after deserialization

private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {

// Any Custom logic

ois.defaultReadObject(); // Calling the default deserialization logic

// Any Custom logic

}



Объявление обоих методов как частных необходимо (публичные методы не будут работать), поэтому вместо JVM их больше ничто не сможет увидеть. Это также доказывает, что ни один метод не наследуется, не переопределяется и не перегружается. JVM автоматически проверяет эти методы и вызывает их во время процесса сериализации-десериализации. JVM может вызывать эти частные методы, но другие объекты не могут, таким образом, целостность класса сохраняется, и протокол сериализации может продолжать работать в обычном режиме.

Несмотря на то, что эти специализированные частные методы предоставляются, сериализация объектов работает таким же образом, вызывая ObjectOutputStream.writeObject() или ObjectInputStream.readObject() .

Вызов ObjectOutputStream.writeObject() или ObjectInputStream.readObject() запускает протокол сериализации. Сначала объект проверяется, чтобы убедиться, что он реализует Сериализуемый а затем проверяется, предоставлен ли какой-либо из этих частных методов. Если они предоставлены, класс stream передается в качестве параметра этим методам, предоставляя коду контроль над его использованием.

Мы можем вызвать ObjectOutputStream.defaultWriteObject() и ObjectInputStream.defaultReadObject() из этих методов, чтобы получить логику сериализации по умолчанию. Эти вызовы делают то, на что они похожи – они выполняют запись и чтение сериализованного объекта по умолчанию, что важно, потому что мы не заменяем обычный процесс, мы только добавляем к нему.

Эти частные методы можно использовать для любой настройки, которую вы хотите выполнить в процессе сериализации, например, шифрование может быть добавлено к выходным данным, а дешифрование – к входным (обратите внимание, что байты записываются и считываются открытым текстом без каких-либо запутываний вообще). Их можно использовать для добавления дополнительных данных в поток, возможно, кода управления версиями компании, возможности поистине безграничны.

Помимо методов writeObject и readObject, мы также можем использовать другие магические методы сериализации для получения некоторых дополнительных функций.

Остановка сериализации и десериализации


Предположим, у нас есть класс, который получил возможность сериализации от своего родителя, что означает, что наш класс расширяется от другого класса, который реализует Сериализуемый .

Это означает, что любой может сериализовать и десериализовать объект нашего класса. Но что, если мы не хотим, чтобы наш класс был сериализован или десериализован, например, наш класс является одноэлементным, и мы хотим предотвратить создание любого нового объекта, помните, что процесс десериализации создает новый объект .

Чтобы остановить сериализацию для нашего класса, мы можем еще раз использовать вышеуказанные частные методы, чтобы просто вызвать исключение NotSerializableException . Любая попытка сериализации или десериализации вашего объекта теперь всегда будет приводить к возникновению исключения. И поскольку эти методы объявлены как частные , никто не может переопределить ваши методы и изменить их.



private void writeObject(ObjectOutputStream oos) throws IOException {

throw new NotSerializableException("Serialization is not supported on this object!");

}



private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {

throw new NotSerializableException("Serialization is not supported on this object!");

}



Однако это является нарушением принципа замены Лискова. И Методы writeReplace и readResolve могут быть использованы для достижения одноэлементного поведения.   Эти методы используются для того, чтобы объект мог предоставить альтернативное представление для самого себя в потоке объектов. Проще говоря, readResolve можно использовать для изменения данных, которые десериализуются с помощью метода readObject, а writeReplace можно использовать для изменения данных, которые сериализуются с помощью writeObject.

Java Сериализацию также можно использовать для глубокого клонирования объекта . Клонирование Java – самая дискуссионная тема в сообществе Java, и у нее, безусловно, есть свои недостатки, но она по-прежнему остается самым популярным и простым способом создания копии объекта до тех пор, пока этот объект не будет полностью заполнен обязательными условиями клонирования Java. Я подробно рассмотрел клонирование в 3 статьях длиной Серия Клонирования Java , которая включает такие статьи, как Клонирование Java И Типы Клонирования (Мелкое И Глубокое) Подробно С примером , Клонирование Java – Конструктор Копирования По сравнению с клонированием , Клонирование Java – Даже конструкторов копирования Недостаточно , продолжайте и прочитайте их, если хотите узнать больше о клонировании.
1   ...   18   19   20   21   22   23   24   25   ...   39


написать администратору сайта