Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
serialversionID在java反序列化中的工作方式_Java_Serialization - Fatal编程技术网

serialversionID在java反序列化中的工作方式

serialversionID在java反序列化中的工作方式,java,serialization,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[]) throw

我有一门课

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
这意味着每当我执行反序列化时 正在检查学生类的serialversionID

我的怀疑是

1反序列化时是否强制要求学生上课

2根据序列化定义,要通过网络以字节流的形式传输java对象,我们正在执行序列化。因此,如果通过网络传输对象,则另一端的学生类如何可用


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


提前感谢…

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

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

1反序列化时是否强制要求学生上课

2根据序列化定义,要通过网络以字节流的形式传输java对象,我们正在执行序列化。因此,如果通过网络传输对象,则另一端的学生类如何可用

你必须处理好这件事。在反序列化序列化学生之前,必须分发学生类

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

编辑:


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

据我所知,通常在传输对象时,我们需要的是学生对象中的属性值


学生类应该在另一边。

你能检查我的第二个问题吗?例如,在我的应用程序中,每个entityHibernate实体都是可序列化的。因为我的web应用程序存在于不同的服务器上,而我的数据库位于不同的服务器上。这就是我们实现可序列化的原因。在这种情况下,你能解释一下如何实现吗序列化正在工作?你理解我的问题吗?这里的实体表示我的自定义类仅在hibernate中为每个数据库表创建一个等效的java类相信我,如果该类在另一端不存在,你将无法从该类中获得任何反序列化实例。