Как работает serialversionID в десериализации в Java

1

У меня есть класс вроде

class Stundent
{
   private static final long serialVersionUID = 1L;

     private int no;
     private String name;

    //setters and getters
}

И затем я использовал следующий код для сериализации и десериализации

public class Serialization{

    public static void main(String args[]) throws Exception {
        File file = new File("out.ser");
        FileOutputStream fos = new FileOutputStream(file);
        ObjectOutputStream oos = new ObjectOutputStream(fos);

        SerializeMe serializeMe = new SerializeMe(1);
        oos.writeObject(serializeMe);
        oos.close();    
    }
}


 public class DeSerialization{

    public static void main(String args[]) throws Exception {

       File file = new File("out.ser");
     FileInputStream fis = new FileInputStream(file);
     ObjectInputStream ois = new ObjectInputStream(fis);

    SerializeMe dto = (SerializeMe) ois.readObject();
    System.out.println("data : " + dto.getData());
    ois.close();   
    }
}

После запуска класса Serialization я изменил serialiversionID на 2, а затем запустил вторую программу, затем я получил

 java.io.InvalidClassException:
SerializeMe; local class incompatible

Это означает, что всякий раз, когда я выполняю десериализацию, проверяется serialversionID класса Student.

Мое сомнение

1) Обязательно ли иметь студенческий класс во время десериализации?

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

Например, в моем приложении каждый объект (объект Hibernate) является Serializable. Поскольку мое веб-приложение существует на разных серверах, а моя база данных находится в differentserver.Это причина, по которой мы внедрили Serializable. В этом случае вы можете объяснить, как работает сериализация?

Заранее спасибо...

Теги:
serialization

2 ответа

1
Лучший ответ

Когда вы десериализуете сериализованный объект, тот же класс должен присутствовать, чтобы построить экземпляр этого класса.

serialVersionUID должен указать, присутствует ли serialVersionUID и та же версия класса в терминах процесса сериализации. Если класс, который присутствует, имеет другое значение serialVersionUID (по сравнению со значением, считанным из двоичных данных/потока сериализованного объекта), десериализация будет прервана путем выброса InvalidClassException.

1) Обязательно ли иметь студенческий класс во время десериализации?

Да.

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

Вы должны позаботиться об этом. Вы должны распространять Student класс до десериализации сериализованную Student.

Десериализация может произойти только в том случае, если для сериализованного класса существует одна и та же версия (определяемая значением serialVersionUID). Сериализация экземпляров стандартной библиотеки не является проблемой, потому что они присутствуют во всех JRE (хотя разные версии могут присутствовать с разными полями serialVersionUID !), Поэтому вы можете "передавать" такие объекты между разными JRE. Если экземпляр персонализированного класса передается, тот же файл класса должен быть доступен в месте назначения до процесса десериализации.

Редактировать:

Вы написали, что ваше "веб-приложение существует на разных серверах". Ваше веб-приложение включает файлы вашего класса, которые неявно означают, что файлы классов будут доступны на всех серверах. Таким образом, сериализованный объект с одного сервера можно десериализовать на другом.

  • 0
    Можешь проверить мой второй вопрос?
  • 0
    Уже сделал и отредактировал мой ответ.
Показать ещё 11 комментариев
-1

Насколько я понимаю, обычно, когда мы передаем объекты, именно значения атрибутов внутри объекта Student - это то, что нам нужно.

Студенческий класс должен присутствовать на другой стороне.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню