Рубрики

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

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

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

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

public final void writeObject(Object obj)
                       throws IOException

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

public final Object readObject()
                  throws IOException,
               ClassNotFoundException

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

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

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

class A implements Serializable{

// B also implements Serializable
// interface.
B ob=new B();  
}

SerialVersionUID
Среда выполнения сериализации связывает номер версии с каждым классом Serializable, который называется SerialVersionUID, который используется во время десериализации для проверки того, что отправитель и получатель сериализованного объекта загрузили классы для этого объекта, которые совместимы в отношении сериализации. Если получатель загрузил класс для объекта, который имеет другой UID, чем у соответствующего класса отправителя, десериализация приведет к исключению InvalidClassException . Сериализуемый класс может объявить свой собственный UID явно, объявив имя поля.
Он должен быть статическим, окончательным и иметь тип long.
т. е. ЛЮБОЙ ДОСТУП-МОДИФИКАТОР static final long serialVersionUID = 42L;

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

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

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

serialver [-classpath classpath] [-show] [имя класса…]

Пример 1:

// Java-код для сериализации и десериализации
// объекта Java

import java.io.*;

  

class Demo implements java.io.Serializable

{

    public int a;

    public String b;

  

    // Конструктор по умолчанию

    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";

          

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

        try

        {   

            // Сохранение объекта в файл

            FileOutputStream file = new FileOutputStream(filename);

            ObjectOutputStream out = new ObjectOutputStream(file);

              

            // Метод сериализации объекта

            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;

  

        // Десериализация

        try

        {   

            // Чтение объекта из файла

            FileInputStream file = new FileInputStream(filename);

            ObjectInputStream in = new ObjectInputStream(file);

              

            // Способ десериализации объекта

            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");

        }

  

    }

}

Выход :

Object has been serialized
Object has been deserialized 
a = 1
b = geeksforgeeks

Пример 2:

// Java-код для сериализации и десериализации
// объекта Java

import java.io.*;

  

class Emp implements Serializable {

private static final long serialversionUID =

                                 129348938L;

    transient int a;

    static int b;

    String name;

    int age;

  

    // Конструктор по умолчанию

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";

  

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

        try {

  

            // Сохранение объекта в файл

            FileOutputStream file = new FileOutputStream

                                           (filename);

            ObjectOutputStream out = new ObjectOutputStream

                                           (file);

  

            // Метод сериализации объекта

            out.writeObject(object);

  

            out.close();

            file.close();

  

            System.out.println("Object has been serialized\n"

                              + "Data before Deserialization.");

            printdata(object);

  

            // значение статической переменной изменено

            object.b = 2000;

        }

  

        catch (IOException ex) {

            System.out.println("IOException is caught");

        }

  

        object = null;

  

        // Десериализация

        try {

  

            // Чтение объекта из файла

            FileInputStream file = new FileInputStream

                                         (filename);

            ObjectInputStream in = new ObjectInputStream

                                         (file);

  

            // Способ десериализации объекта

            object = (Emp)in.readObject();

  

            in.close();

            file.close();

            System.out.println("Object has been deserialized\n"

                                + "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");

        }

    }

}

Выход:

Object has been serialized
Data before Deserialization.
name = ab
age = 20
a = 2
b = 1000
Object has been deserialized
Data after Deserialization.
name = ab
age = 20
a = 0
b = 2000

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

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

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

Рекомендуемые посты:

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

0.00 (0%) 0 votes