世界速看:java的序列化机制是什么?java序列化ID的作用

发布时间:   来源:CSDN  

序列化ID的作用:

序列化ID决定着是否能够成功反序列化!简单来说,java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地实体类中的serialVersionUID进行比较,如果相同则认为是一致的,便可以进行反序列化,否则就会报序列化版本不一致的异常。

通俗意思就是:


(相关资料图)

不加序列化ID:

某个类进行序列化保存本地或者进行网络传输反序列化时,如果修改了该类,则序列化ID不一致,报错!

加序列化:

某个类进行序列化保存本地或者进行网络传输反序列化时,如果修改了该类,则原本类中存在的值,可取出,不存在的,取默认,不会报错!

看例子:

1、不加序列化ID执行序列化:

import java.io.*;public class Solution implements Serializable {    String name = "abc";    public static void main(String[] args) throws IOException, ClassNotFoundException {        Solution s = new Solution();        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("a.txt"));        objectOutputStream.writeObject(s);        objectOutputStream.close();    }}

2、修改类,在类属性中添加age属性,进行反序列化:

import java.io.*;public class Solution implements Serializable {    String name = "abc";    int age = 10;    public static void main(String[] args) throws IOException, ClassNotFoundException {        FileInputStream fis = new FileInputStream("a.txt");        ObjectInputStream inputStream = new ObjectInputStream(fis);        Solution s1 = (Solution) inputStream.readObject();        System.out.println(s1.name);        System.out.println(s1.age);    }}

3、结果:

可以发现,修改了类之后,serialVersionUID发生了改变,反序列化失败,连name属性都提取不出!

1、加序列化ID进行序列化:

import java.io.*;public class Solution implements Serializable {    private final static long serialVersionUID = 20000L;    String name = "abc";    public static void main(String[] args) throws IOException, ClassNotFoundException {        Solution s = new Solution();        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("a.txt"));        objectOutputStream.writeObject(s);        objectOutputStream.close();    }}

2、在类中添加age属性,进行反序列化:

import java.io.*;public class Solution implements Serializable {    private final static long serialVersionUID = 20000L;    String name = "abc";     int age = 10;    public static void main(String[] args) throws IOException, ClassNotFoundException {        FileInputStream fis = new FileInputStream("a.txt");        ObjectInputStream inputStream = new ObjectInputStream(fis);        Solution s1 = (Solution) inputStream.readObject();        System.out.println(s1.name);        System.out.println(s1.age);    }}

3、结果:

可以看到,name值取出来了,而且age值为默认0!

因为age没有进行序列化,所以保存的字节流文件中并没有age对应值,我们只能取出Solution类中的name属性的值,因为序列化的字节流中存在,当序列化ID相同时,反序列化执行成功!

相关文章Related

返回栏目>>