serialVersionUID的功能是什么呢?
在一些日常开发中,我们经常看见别人的实体类中有serialVersionUID变量
那么这个serialVersionUID变量到底起什么作用呢?
下文笔者将一一道来,如下所示
例:
那么这个serialVersionUID变量到底起什么作用呢?
下文笔者将一一道来,如下所示
serialVersionUID的功能
serialVersionUID是Serializable类中用于定义版本的控件
serialVersionUID的功能:
用于表示当前实体对象可使用此类进行序列化和反序列化
两个相同的serialVersionUID值的信息,反序列化为同一个类不会出现问题
如果两个不同的serialVersionUID值,反序列化为同一个类时,则会产生一些异常信息
注意事项:
如果我们没有定义serialVersionUID值时
JVM会根据自己的算法生成一个默认的serialVersionUID值
可能会由于JVM不同,生成的serialVersionUID值不同,所以笔者建议实体类定义时
最好加上serialVersionUID值
何时修改serialVersionUID的值
当实体类中出现新的不兼容的新Java类型时,此时我们应该修改serialVersionUID的值
IDE如何生成serialVersionUID值
打开Preferences–>Editor–>Inspections
然后在右侧输入UID进行搜索(搜索方式比较快
也可在java–>Serialization issues里找)
然后勾选Serializable class without 'serialVersionUID'后面的复选框
右侧Severity默认Warning即可

例:
package com.java265.reflect;
import org.junit.Test;
import java.io.*;
/**
* 深入理解serialVersionUID
*/
public class SerializableTest {
@Test
public void testWrite() {
Address address = new Address();
address.setStreet("猫猫第一大道");
try {
FileOutputStream fout = new FileOutputStream("address.ser");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(address);
oos.close();
System.out.println("Done");
} catch (Exception ex) {
ex.printStackTrace();
}
}
@Test
public void testRead() {
Address address;
try {
FileInputStream fin = new FileInputStream("address.ser");
ObjectInputStream ois = new ObjectInputStream(fin);
address = (Address) ois.readObject();
ois.close();
System.out.println(address); // 街道: 猫猫第一大道
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static class Address implements Serializable {
private static final long serialVersionUID = 1L;
String street;
public String getStreet() {
return this.street;
}
public void setStreet(String street) {
this.street = street;
}
@Override
public String toString() {
return new StringBuffer(" 街道 : ")
.append(this.street)
.toString();
}
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


