本篇文章是 Stack Overflow 周报的第二周,共收集了 4 道高关注的问题和对应的高赞回答。公众号「渡码」为日更,欢迎关注。


 

DAY1.  serialVersionUID 的重要性  

关注: 2820,最高赞: 2152

这篇文章介绍一下 Java 中 serialVersionUID 属性的含义以及重要性。从属性可以看出它与序列化有关系,所以在  java.io.Serializable 接口的注释中对它有详细的介绍,下面我们对照文档注释来学习一下。Java 中每个可序列化的类都有一个版本号与之关联,这个版本号就是 serialVersionUID。它在对象反序列化时使用, 用于判断该类的发送方和接收方的 serialVersionUID 是否一致,如果接收方装载的类的 serialVersionUID 与发送方不一致,则抛出 InvalidClassException 异常。一个可序列化的类可以显示地声明 serialVersionUID 属性,但必须是 static,final,long 修饰的,如:

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

下面结合实际的例子来看看 serialVersionUID 的用法以及作用,上面说了 serialVersionUID 属性是定义在可序列化的类中,所以我们的类需要实现 java.io.Serializable 接口。因此,我们定义的 Person 类如下:

复制代码
package com.cnblogs.duma.week2;  import java.io.Serializable;  public class Person implements Serializable {     private static final long serialVersionUID = 42L;     public int age;     public String name;      public Person(int age, String name){         this.age = age;         this.name = name;     }      @Override     public String toString() {         return age + "," + name;     } }
复制代码

接下来,我们在定义两个方法分别用来序列化和反序列化,序列化方法如下:

复制代码
// 将 Person 对象序列化后存到文件public static void ser() {     Person p = new Person(28, "duma");     System.out.println("person Seria:" + p);     try {         FileOutputStream fos = new FileOutputStream("person.txt");         ObjectOutputStream oos = new ObjectOutputStream(fos);         oos.writeObject(p);         oos.flush();         oos.close();     } catch (IOException e) {         e.printStackTrace();     } }
复制代码

序列化方法如下:

复制代码
// 从文件中反序列化出 Person 对象public static void deser() {     Person p;     try {         FileInputStream fis = new FileInputStream("person.txt");         ObjectInputStream ois = new ObjectInputStream(fis);         p = (Person) ois.readObject();         ois.close();         System.out.println(p.toString());     } catch (IOException |