gpt4 book ai didi

java - SerialversionID 在 Java 反序列化中如何工作

转载 作者:太空宇宙 更新时间:2023-11-04 14:34:36 25 4
gpt4 key购买 nike

我有一个类似的类(class)

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();
}
}

运行序列化类后,我将serialiversionID更改为2,然后运行第二个程序,然后我得到了

 java.io.InvalidClassException:
SerializeMe; local class incompatible

这意味着每当我执行反序列化时正在检查Student类的serialversionID。

我的疑问是

1)反序列化时是否必须有Student类?

2)根据序列化定义,为了通过网络将java对象作为字节流传输,我们正在执行序列化。因此,如果通过网络传输对象,那么Student类如何在另一端可用。

For example in my application every entity(Hibernate entity) is Serializable. Because my web application exist in different server and my database is in differentserver.That is the reason we have implemented Serializable.In this case can u explain how serialization is working?

提前致谢...

最佳答案

当您反序列化序列化对象时,必须存在相同的类才能构造该类的实例。

serialVersionUID 用于判断序列化过程中是否存在相同版本的类。如果存在的类具有不同的 serialVersionUID 值(与从序列化对象的二进制数据/流中读取的值相比),则反序列化将通过抛出 InvalidClassException 中止>.

1)Is it mandatory to have Student class at the time of deserialization?

是的。

2)As per serialization definition, to transfer the java objects as stream of bytes through network we are performing serialization.So if an object is transferred through network ,how the Student class is available in other side.

你必须照顾好这一点。在反序列化序列化的 Student 之前,您必须分发 Student 类。

仅当序列化类存在相同版本(由 serialVersionUID 值确定)时,才会发生反序列化。序列化标准库的实例不是问题,因为它们存在于所有 JRE 中(尽管不同版本可能存在不同的 serialVersionUID 字段!),因此您可以在不同的 JRE 之间“传输”此类对象。如果传输自定义类的实例,则在反序列化过程之前,必须在目的地提供相同的类文件。

编辑:

您写道您的“Web 应用程序存在于不同的服务器上”。您的 Web 应用程序包含您的类文件,这隐式意味着类文件将在所有服务器上可用。因此,来自一台服务器的序列化对象可以在另一台服务器上反序列化。

关于java - SerialversionID 在 Java 反序列化中如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25744224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com