Сериализуемый интерфейс в Java с примерами

Опубликовано: 2021-11-29

Java предлагает несколько пакетов, одним из которых является интерфейс Serializable. Он присутствует в пакете Java java.io и является типом интерфейса маркера. Когда он определен как интерфейс маркера, в интерфейсе нет методов или полей. Таким образом, всякий раз, когда какие-либо классы реализуют интерфейс, интерфейс не обязан реализовывать какие-либо методы. Классы реализуют интерфейс, если класс хочет, чтобы их экземпляры были сериализованы или десериализованы.

Механизм сериализации используется для преобразования состояния объекта в поток байтов. Этот механизм осуществляется с помощью ObjectOutputStream. Процесс десериализации прямо противоположен процессу сериализации. В этом случае поток байтов преобразуется обратно в объект Java. ObjectInputStream используется для десериализации.

Оглавление

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

Преобразование состояния любого объекта в поток байтов называется сериализацией. А противоположностью сериализации является десериализация. Объект Java можно преобразовать в поток статических байтов. Затем этот статический поток можно сохранить в базе данных или передать в другую сеть. Процесс сериализации зависит от экземпляра. Это означает, что сериализацию объектов можно проводить на одной платформе, а затем десериализацию объектов можно проводить на другой платформе. Для процесса сериализации реализован особый тип интерфейса маркера «Сериализуемый». Таким образом, классы, подходящие для сериализации, т . е . сериализуемый класс в Java , должны реализовывать интерфейс маркера.

Этот механизм записи состояния объекта в поток байтов известен как сериализация. Этот механизм в основном используется в технологиях JMS, EJB, JPA, RMI и Hibernate.

ObjectInputStream и ObjectOutputStream — это формы классов высокого уровня, которые расширяют java.io.InputStream и java.io.OutputStream. Примитивные типы и графы объектов могут быть записаны в OutputStream с помощью ObjectOutputStream в байте.

поток. Поток, полученный в результате преобразования, можно прочитать через ObjectInputStream. Итак, для сериализации метод writeObject() вызывается из ObjectOutputStream, а для десериализации метод readObject() вызывается из класса ObjectInputStream.

Метод, который является наиболее важным в ObjectOutputStream :

Приведенная выше строка кода взята с https://www.baeldung.com/java-serialization.

В приведенной выше строке кода берется сериализуемый объект, а затем он преобразуется в поток или поток байтов.

В случае ObjectInputStream наиболее важным методом является:

Приведенная выше строка кода взята с https://www.baeldung.com/java-serialization.

Приведенная выше строка кода может считывать последовательность байтов и преобразовывать этот поток байтов в объект Java. Исходный объект может быть отброшен через это.

Иллюстрацию процесса сериализации можно описать ниже:

Класс «Человек» рассматривается для сериализации. Статические поля не сериализованы и принадлежат некоторым классам. Поля класса можно игнорировать, используя ключевое слово «transient» в процессе сериализации.

Источник

Объект типа person может быть сохранен в каком-либо локальном файле, а затем значение считано обратно. Для этой цели можно использовать приведенный ниже код.

ObjectOutputStream использовался для сохранения состояния объекта в файл с помощью FileOutputStream. В этом примере в каталоге проекта создан файл с именем yourfile.txt. С помощью FileInputStream загружается созданный файл. Затем этот поток подхватывается ObjectInputStream и преобразуется в новый объект с именем p2. Наконец, состояние загруженного объекта проверяется, и оно сопоставляется с исходным состоянием объекта. Загружаемый объект должен быть явно приведен к типичному человеку.

Предостережения в сериализации Java

1. Наследование и состав

Всякий раз, когда пользователь реализует интерфейс java.io.Serializable, все подклассы класса, реализующие этот интерфейс, становятся сериализуемыми. Кроме того, если объект содержит ссылку на другой объект, объекты, на которые ссылаются для реализации интерфейса, сериализуемы отдельно; если эти объекты не реализуют интерфейс, будет выброшено исключение. Выброшенное исключение будет NotSerializableException. Кроме того, если предположить, что массив объектов хранится в сериализуемом объекте, все объекты массива должны быть сериализованы. Если сериализация объектов не происходит, будет выдано исключение «NotSerializableException».

2. UID серийной версии

Для каждого класса, реализующего интерфейс Serializable, с каждым классом связан номер. Номер связан с виртуальной машиной Java. В основном это делается для проверки того, что загружаемые и сохраняемые объекты имеют точные атрибуты. Только если атрибуты одинаковы, объекты будут совместимы при сериализации. IDE генерирует эти числа автоматически и в основном основывается на именах класса, его атрибутах и ​​связанных с ним модификаторах доступа. Исключение «InvalidClassException» будет выдано, если в результате изменений будет получено другое число.

Если serialVersionUID не объявлен сериализуемым классом, JVM автоматически сгенерирует его во время выполнения. Хотя число будет генерироваться автоматически, все же рекомендуется, чтобы классы объявляли serialVersionUID. Это связано с тем, что serialVersionUID, который будет создан автоматически, будет зависеть от компилятора и иногда может вызывать неожиданные исключения InvalidClassException.

3. Пользовательская сериализация

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

Вышеупомянутые два метода могут использоваться для сериализации атрибутов в любые формы, которые могут быть сериализованы, которые ранее были несериализуемыми.

Преимущества сериализации в Java

Одним из преимуществ сериализации в Java является то, что состояние объекта можно передавать по сети.

Интерфейс Java java.io.Serializable

java.io.Serializable — это маркерный интерфейс, который означает, что в интерфейсе нет методов и объектов. Основной функцией интерфейса маркера является маркировка

классы Java, чтобы дать определенные возможности всем объектам классов. Примерами интерфейсов маркеров являются Remote и Cloneable.

Интерфейс должен быть реализован любым классом, который использует интерфейс для сериализации своих объектов. По умолчанию такие классы, как классы-оболочки и класс String, реализуют интерфейс java.io.Serializable.

Пример сериализуемой Java показан ниже.

В приведенном выше коде видно, что класс Student реализует интерфейс Serializable. Поэтому, как только класс реализует интерфейс Serializable, объекты внутри класса могут быть преобразованы в байты потока.

  • Класс ObjectOutputStream

Этот класс используется для записи примитивных типов данных и объектов Java в OutputStream. Объект, поддерживающий интерфейс java.io.Serializable, можно использовать для записи в потоки.

  • Класс ObjectInputStream

Все примитивные данные, записанные с помощью ObjectOutputStream, десериализуются с помощью ObjectInputStream.

Пример Serializable интерфейса в Java показан ниже.

В этом примере класс Student будет сериализован. Метод writeObject() класса ObjectOutputStream предоставляет все функции для сериализации объектов. Состояние объекта сохраняется в файле с именем f.txt.

Выводы

В статье обсуждалась концепция сериализации в Java. В нем перечислены интерфейсы и другие важные методы, необходимые для сериализации объектов класса. Процесс сериализации всегда связан с идентификатором или числом с каждым сериализуемым классом. Этот номер называется SerialVersionUID. Основное использование SerialVersionUID — проверка отправителя и получателя для объекта, который должен быть сериализован. Это потому, что и отправитель, и получатель должны быть одинаковыми.

Это важная особенность языка программирования Java. Если вы хотите узнать больше о таких важных функциях и концепциях Java и улучшить свои навыки языка программирования, вы можете посетить курсы по разработке программного обеспечения , предлагаемые upGrad. Если вы работаете профессионалом, курс лучше всего подходит для вас. По любым вопросам можно связаться с нашей командой поддержки. Вы также можете просмотреть наш веб-сайт для конкретного курса и получить подробную информацию.

Что такое сериализуемый интерфейс в Java?

Сериализуемый интерфейс — это маркерный интерфейс. Интерфейс маркера подсказывает среде выполнения Java, что реализующий класс позволяет сериализовать себя. Среда выполнения будет использовать этот интерфейс для сериализации объекта. Сериализуемый интерфейс в java — это специальный интерфейс, реализуемый классами данных в java. Когда класс реализует этот интерфейс, он может быть сохранен в базе данных. Этот интерфейс объявлен в пакете java.io. Сериализуемый интерфейс имеет два метода: readResolve() и writeReplace(), которые используются для чтения и записи объекта в базе данных.

Что произойдет, если мы реализуем интерфейс Serializable в Java?

Реализация интерфейса Serializable в Java означает наличие объекта, который можно сериализовать и десериализовать в любой системе, имеющей интерфейс Serializable. Реализация такого интерфейса будет эффективна, когда класс сериализуется извне сторонними библиотеками (JSON, XML и т. д.) или сетевыми протоколами. Когда переменная объявлена ​​как Serializable, каждый экземпляр переменной будет сериализован и десериализован, если он передается в качестве параметра методу или когда он возвращается из метода. Сериализация выполняется программно, чтобы состояние объекта можно было сохранить на потом, когда его нужно будет десериализовать и представить пользователю объекта.

Можем ли мы передать сериализованный объект по сети?

Сериализованный объект — это объект, содержащий поток байтов. Конструктор объекта или методы writeObject()/readObject() используются для помещения потока байтов в объект. Сохраняемые данные могут быть текстом, аудио, видео или любыми пользовательскими данными приложения. Данные для этих объектов могут храниться в файле или на удаленном сервере. Для передачи сериализованных объектов по сети необходимо использовать протокол RMI (Remote Method Invocation). RMI — хороший протокол для создания распределенных приложений. Это позволяет клиенту взаимодействовать с методами объектов в приложении Java, работающем на сервере. Протокол RMI представляет собой механизм удаленного вызова процедур (RPC).