【问题标题】:How serialversionID is working in deserialization in javaserialversionID 如何在 java 的反序列化中工作
【发布时间】:2014-09-09 12:06:50
【问题描述】:

我有一门课

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类如何在另一端可用。

例如,在我的应用程序中,每个实体(Hibernate 实体)都是 可序列化。 因为我的 Web 应用程序存在于不同的服务器和我的数据库中 在不同的服务器中。这就是我们实施的原因 可序列化。在这种情况下,你能解释一下序列化是如何工作的吗?

提前谢谢...

【问题讨论】:

    标签: java serialization


    【解决方案1】:

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

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

    1)反序列化时必须要有Student类吗?

    是的。

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

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

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

    编辑:

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

    【讨论】:

    • 你能检查我的第二个问题吗?
    • 例如,在我的应用程序中,每个实体(Hibernate 实体)都是可序列化的。因为我的 Web 应用程序存在于不同的服务器中,而我的数据库位于不同的服务器中。这就是我们实现可序列化的原因。在这种情况下你能解释一下序列化是如何工作的吗?
    • 你明白我的问题了吗?
    • 这里的实体只表示我的自定义类(在休眠中,我们将为每个数据库表创建一个等效的 java 类)
    • 相信我,如果该类不存在于另一边,您将不会从该类中获得任何反序列化实例。
    【解决方案2】:

    据我了解,通常我们在传递对象时,我们需要的是Student对象内部的属性值。

    Student 类应该出现在另一边。

    【讨论】:

      猜你喜欢
      • 2014-01-24
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-14
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      相关资源
      最近更新 更多