我有一个像
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
这意味着每当我执行反序列化
学生班级的serialversionID正在检查。
我的疑问是
1)反序列化时是否必须上学生课?
2)根据序列化定义,要通过网络将Java对象作为字节流进行传输,我们正在执行序列化。因此,如果通过网络传输对象,则在另一端如何使用Student类。
例如,在我的应用程序中,每个实体(休眠实体)都是
可序列化。
因为我的Web应用程序存在于其他服务器和数据库中
在不同的服务器中。这就是我们实施的原因
可序列化。在这种情况下,您可以解释序列化的工作方式吗?
提前致谢...
最佳答案
反序列化序列化对象时,必须存在相同的类才能构造该类的实例。serialVersionUID
用来判断在序列化过程中是否存在相同版本的类。如果存在的类具有不同的serialVersionUID
值(与从序列化对象的二进制数据/流中读取的值相比),则反序列化将通过抛出InvalidClassException
中止。
1)反序列化时是否必须上学生课?
是。
2)根据序列化定义,要通过网络将Java对象作为字节流进行传输,我们正在执行序列化。因此,如果通过网络传输对象,则在另一端如何使用Student类。
您必须照顾好这一点。在反序列化序列化的Student
之前,必须分发Student
类。
仅当序列化的类存在相同版本(由serialVersionUID
值确定)时,才能进行反序列化。序列化标准库的实例不是问题,因为所有JRE中都存在这些实例(尽管不同的serialVersionUID
字段中可能存在不同的版本!),因此您可以在不同的JRE之间“转移”这样的对象。如果传输了自定义类的实例,则在反序列化过程之前,必须在目标位置提供相同的类文件。
编辑:
您写道,“ Web应用程序存在于不同的服务器上”。您的Web应用程序包含类文件,这意味着这些类文件将在所有服务器上可用。因此,来自一台服务器的序列化对象可以在另一台服务器上反序列化。