serialversionID在java反序列化中的工作方式
我有一门课serialversionID在java反序列化中的工作方式,java,serialization,Java,Serialization,我有一门课 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[]) throw
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
我的怀疑是
1反序列化时是否强制要求学生上课
2根据序列化定义,要通过网络以字节流的形式传输java对象,我们正在执行序列化。因此,如果通过网络传输对象,则另一端的学生类如何可用
例如,在我的应用程序中,每个entityHibernate实体都是 可序列化。 因为我的web应用程序存在于不同的服务器和数据库中 在不同的服务器中。这就是我们实现的原因 在这种情况下,你能解释一下序列化是如何工作的吗
提前感谢…当反序列化序列化对象时,必须存在同一个类才能构造该类的实例 serialVersionUID用于判断在序列化过程中是否存在相同版本的类。如果存在的类的SerialVersionId值与从序列化对象的二进制数据/流读取的值不同,则将通过引发InvalidClassException中止反序列化 1反序列化时是否强制要求学生上课 对 2根据序列化定义,要通过网络以字节流的形式传输java对象,我们正在执行序列化。因此,如果通过网络传输对象,则另一端的学生类如何可用 你必须处理好这件事。在反序列化序列化学生之前,必须分发学生类 只有当序列化类的SerialVersionId值确定的版本相同时,才能进行反序列化。序列化标准库的实例不是问题,因为这些实例存在于所有JRE中,尽管不同版本可能存在不同的serialVersionUID字段!,因此,您可以在不同的JRE之间传输此类对象。如果传输自定义类的实例,则在反序列化过程之前,必须在目标位置提供相同的类文件 编辑:
您写道您的web应用程序存在于不同的服务器上。web应用程序包含类文件,这意味着这些类文件将在所有服务器上都可用。因此,一台服务器上的序列化对象可以在另一台服务器上反序列化。据我所知,通常在传输对象时,我们需要的是学生对象中的属性值
学生类应该在另一边。你能检查我的第二个问题吗?例如,在我的应用程序中,每个entityHibernate实体都是可序列化的。因为我的web应用程序存在于不同的服务器上,而我的数据库位于不同的服务器上。这就是我们实现可序列化的原因。在这种情况下,你能解释一下如何实现吗序列化正在工作?你理解我的问题吗?这里的实体表示我的自定义类仅在hibernate中为每个数据库表创建一个等效的java类相信我,如果该类在另一端不存在,你将无法从该类中获得任何反序列化实例。