StackOverflow 周报 - 与高关注的问题过过招(Java)
本篇文章是 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 |