serialVersionUID的功能是什么呢?

乔欣 Java经验 发布时间:2023-02-14 21:00:13 阅读数:15978 1
在一些日常开发中,我们经常看见别人的实体类中有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即可
serialVersionUID
例:
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();
        }
    }
 
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202302/16763807715789.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者