我有一个像
这样的课程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
这意味着每当我执行反序列化时 Student类的serialversionID正在检查。
我怀疑是
1)反序列化时是否必须有Student课程?
2)根据序列化定义,要通过网络将java对象作为字节流传输,我们正在执行序列化。因此,如果通过网络传输对象,那么Student类在另一侧是如何可用的。
例如在我的应用程序中,每个实体(Hibernate实体)都是 序列化。 因为我的Web应用程序存在于不同的服务器和我的数据库 是在不同的服务器。这就是我们实施的原因 Serializable。在这种情况下你可以解释序列化是如何工作的吗?
提前致谢...
答案 0 :(得分:1)
反序列化序列化对象时,必须存在相同的类才能构造该类的实例。
serialVersionUID
用于判断序列化过程中是否存在相同版本的类。如果存在的类具有不同的serialVersionUID
值(与从序列化对象的二进制数据/流中读取的值相比),则将通过抛出InvalidClassException
来中止反序列化。
1)反序列化时是否必须有Student课程?
是
2)根据序列化定义,要通过网络将java对象作为字节流传输,我们正在执行序列化。因此,如果通过网络传输对象,那么Student类在另一侧是如何可用的。
你必须照顾好这一点。您必须在反序列化序列化Student
之前分发Student
类。
只有在序列化类存在相同版本(由serialVersionUID
值确定)时才会发生反序列化。序列化标准库的实例不是问题,因为它们存在于所有JRE中(尽管不同的版本可能存在于不同的serialVersionUID
字段!),因此您可以"转移&#34 ;不同JRE之间的这类对象。如果传输了自定义类的实例,则必须在反序列化过程之前在目标中提供相同的类文件。
修改强>
您写道,您的" Web应用程序存在于不同的服务器上#34;。您的Web应用程序包含您的类文件,这隐含意味着类文件将在所有服务器上可用。因此,来自一个服务器的序列化对象可以在另一个服务器上反序列化。
答案 1 :(得分:-1)
就我的理解而言,通常当我们传输对象时,Student对象中的属性值就是我们所需要的。
学生班应该在另一边。