У меня есть класс вроде
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. В этом случае вы можете объяснить, как работает сериализация?
Заранее спасибо...
Когда вы десериализуете сериализованный объект, тот же класс должен присутствовать, чтобы построить экземпляр этого класса.
serialVersionUID
должен указать, присутствует ли serialVersionUID
и та же версия класса в терминах процесса сериализации. Если класс, который присутствует, имеет другое значение serialVersionUID
(по сравнению со значением, считанным из двоичных данных/потока сериализованного объекта), десериализация будет прервана путем выброса InvalidClassException
.
1) Обязательно ли иметь студенческий класс во время десериализации?
Да.
2) В соответствии с определением сериализации для переноса объектов java в виде потока байтов через сеть мы выполняем сериализацию. Поэтому, если объект передается через сеть, как класс Student доступен в другой стороне.
Вы должны позаботиться об этом. Вы должны распространять Student
класс до десериализации сериализованную Student
.
Десериализация может произойти только в том случае, если для сериализованного класса существует одна и та же версия (определяемая значением serialVersionUID
). Сериализация экземпляров стандартной библиотеки не является проблемой, потому что они присутствуют во всех JRE (хотя разные версии могут присутствовать с разными полями serialVersionUID
!), Поэтому вы можете "передавать" такие объекты между разными JRE. Если экземпляр персонализированного класса передается, тот же файл класса должен быть доступен в месте назначения до процесса десериализации.
Редактировать:
Вы написали, что ваше "веб-приложение существует на разных серверах". Ваше веб-приложение включает файлы вашего класса, которые неявно означают, что файлы классов будут доступны на всех серверах. Таким образом, сериализованный объект с одного сервера можно десериализовать на другом.
Насколько я понимаю, обычно, когда мы передаем объекты, именно значения атрибутов внутри объекта Student - это то, что нам нужно.
Студенческий класс должен присутствовать на другой стороне.