我有一个像

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应用程序包含类文件,这意味着这些类文件将在所有服务器上可用。因此,来自一台服务器的序列化对象可以在另一台服务器上反序列化。

09-20 21:34