serialversionuID如何在java中进行反序列化

时间:2014-09-09 12:06:51

标签: 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[]) 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。在这种情况下你可以解释序列化是如何工作的吗?

提前致谢...

2 个答案:

答案 0 :(得分:1)

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

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

  

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

  

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

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

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

修改

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

答案 1 :(得分:-1)

就我的理解而言,通常当我们传输对象时,Student对象中的属性值就是我们所需要的。

学生班应该在另一边。