序列化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相同时,反序列化执行成功!