Сериализация и десериализация на Java с примером

Опубликовано: 15 Февраля, 2022

Сериализация - это механизм преобразования состояния объекта в поток байтов. Десериализация - это обратный процесс, в котором поток байтов используется для воссоздания реального объекта Java в памяти. Этот механизм используется для сохранения объекта.

Создаваемый поток байтов не зависит от платформы. Таким образом, объект, сериализованный на одной платформе, может быть десериализован на другой платформе.

Чтобы сделать объект Java сериализуемым, мы реализуем интерфейс java.io.Serializable.
Класс ObjectOutputStream содержит метод writeObject () для сериализации объекта.

 public final void writeObject (объект объект)
                       выбрасывает IOException

Класс ObjectInputStream содержит метод readObject () для десериализации объекта.

public final Object readObject()
                  throws IOException,
               ClassNotFoundException

Преимущества сериализации
1. Сохранить / сохранить состояние объекта.
2. Перемещать объект по сети.

Можно сериализовать только объекты тех классов, которые реализуют интерфейс java.io.Serializable.
Serializable - это интерфейс маркера (не имеет элемента данных и метода). Он используется для «пометки» классов Java, чтобы объекты этих классов могли получить определенные возможности. Другие примеры интерфейсов маркеров: - Клонируемый и удаленный.

Что нужно помнить
1. Если родительский класс реализовал интерфейс Serializable, тогда дочернему классу не нужно его реализовывать, но наоборот, это неверно.
2. В процессе сериализации сохраняются только нестатические элементы данных.
3. Статические элементы данных и временные элементы данных не сохраняются в процессе сериализации. Поэтому, если вы не хотите сохранять значение нестатического элемента данных, сделайте его временным.
4. Конструктор объекта никогда не вызывается при десериализации объекта.
5. Связанные объекты должны реализовывать интерфейс Serializable.
Пример :

класс A реализует Serializable {

// B также реализует Serializable
// интерфейс.
B ob = новый B ();  
}

SerialVersionUID
Среда выполнения сериализации связывает номер версии с каждым классом Serializable, называемым SerialVersionUID, который используется во время десериализации для проверки того, что отправитель и получатель сериализованного объекта загрузили классы для этого объекта, которые совместимы с сериализацией. Если получатель загрузил класс для объекта, который имеет другой UID, чем у соответствующего класса отправителя, десериализация приведет к InvalidClassException . Класс Serializable может явно объявить свой собственный UID, объявив имя поля.
Он должен быть статическим, окончательным и иметь длинный тип.
ie- ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

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

Также рекомендуется использовать приватный модификатор для UID, поскольку он бесполезен как наследуемый член.

серийный номер
Сериалвер - это инструмент, который поставляется с JDK. Он используется для получения номера serialVersionUID для классов Java.
Вы можете запустить следующую команду, чтобы получить serialVersionUID

serialver [-classpath путь к классам] [-show] [имя класса…]

Example 1:

// Java code for serialization and deserialization 
// of a Java object
import java.io.*;
  
class Demo implements java.io.Serializable
{
    public int a;
    public String b;
  
    // Default constructor
    public Demo(int a, String b)
    {
        this.a = a;
        this.b = b;
    }
  
}
  
class Test
{
    public static void main(String[] args)
    {   
        Demo object = new Demo(1, "geeksforgeeks");
        String filename = "file.ser";
          
        // Serialization 
        try
        {   
            //Saving of object in a file
            FileOutputStream file = new FileOutputStream(filename);
            ObjectOutputStream out = new ObjectOutputStream(file);
              
            // Method for serialization of object
            out.writeObject(object);
              
            out.close();
            file.close();
              
            System.out.println("Object has been serialized");
  
        }
          
        catch(IOException ex)
        {
            System.out.println("IOException is caught");
        }
  
  
        Demo object1 = null;
  
        // Deserialization
        try
        {   
            // Reading the object from a file
            FileInputStream file = new FileInputStream(filename);
            ObjectInputStream in = new ObjectInputStream(file);
              
            // Method for deserialization of object
            object1 = (Demo)in.readObject();
              
            in.close();
            file.close();
              
            System.out.println("Object has been deserialized ");
            System.out.println("a = " + object1.a);
            System.out.println("b = " + object1.b);
        }
          
        catch(IOException ex)
        {
            System.out.println("IOException is caught");
        }
          
        catch(ClassNotFoundException ex)
        {
            System.out.println("ClassNotFoundException is caught");
        }
  
    }
}

Выход :

 Объект сериализован
Объект десериализован 
а = 1
б = geeksforgeeks

Example 2:

// Java code for serialization and deserialization 
// of a Java object
import java.io.*;
  
class Emp implements Serializable {
private static final long serialversionUID =
                                 129348938L;
    transient int a;
    static int b;
    String name;
    int age;
  
    // Default constructor
public Emp(String name, int age, int a, int b)
    {
        this.name = name;
        this.age = age;
        this.a = a;
        this.b = b;
    }
  
}
  
public class SerialExample {
public static void printdata(Emp object1)
    {
  
        System.out.println("name = " + object1.name);
        System.out.println("age = " + object1.age);
        System.out.println("a = " + object1.a);
        System.out.println("b = " + object1.b);
    }
  
public static void main(String[] args)
    {
        Emp object = new Emp("ab", 20, 2, 1000);
        String filename = "shubham.txt";
  
        // Serialization
        try {
  
            // Saving of object in a file
            FileOutputStream file = new FileOutputStream
                                           (filename);
            ObjectOutputStream out = new ObjectOutputStream
                                           (file);
  
            // Method for serialization of object
            out.writeObject(object);
  
            out.close();
            file.close();
  
            System.out.println("Object has been serialized "
                              + "Data before Deserialization.");
            printdata(object);
  
            // value of static variable changed
            object.b = 2000;
        }
  
        catch (IOException ex) {
            System.out.println("IOException is caught");
        }
  
        object = null;
  
        // Deserialization
        try {
  
            // Reading the object from a file
            FileInputStream file = new FileInputStream
                                         (filename);
            ObjectInputStream in = new ObjectInputStream
                                         (file);
  
            // Method for deserialization of object
            object = (Emp)in.readObject();
  
            in.close();
            file.close();
            System.out.println("Object has been deserialized "
                                + "Data after Deserialization.");
            printdata(object);
  
            // System.out.println("z = " + object1.z);
        }
  
        catch (IOException ex) {
            System.out.println("IOException is caught");
        }
  
        catch (ClassNotFoundException ex) {
            System.out.println("ClassNotFoundException" +
                                " is caught");
        }
    }
}

Выход:

Объект сериализован
Данные до десериализации.
name = ab
возраст = 20
а = 2
б = 1000
Объект десериализован
Данные после десериализации.
name = ab
возраст = 20
а = 0
b = 2000

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

Эта статья предоставлена Мехаком Нарангом и Шубхамом Джунджей . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.


Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.

Вниманию читателя! Не переставай учиться сейчас. Ознакомьтесь со всеми важными концепциями Java Foundation и коллекций с помощью курса "Основы Java и Java Collections" по доступной для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .