Java类中serialVersionUID的作用是什么呢?

Java-教程王 Java每日一问 发布时间:2021-08-11 21:59:20 阅读数:18322 1 Java类
今天在编写Servlet程序时,系统竟然提示警告
The serializable class ServletHelloWorld does not declare a static final serialVersionUID field of type long
它的警告信息就是告诉我们必须在类中定义相关的ID信息,那么这个serialVersionUID的作用是什么呢?

serialVersionUID用于Java序列化

序列化主要用于类可持久化,
如:网络传输或本地存储,当类涉及在传输(分布式)或缓存(持久化),此时需要序列化,然后才能进行相关操作

JAVA序列化的机制:
使用判断类的serialVersionUID来验证的版本一致的

当两者的serialVersionUID相同时,则说明版本一致,可进行反序列化, 否则会由于版本不一致而导致反序列化异常的现象,输出相应的异常信息(InvalidCastException)

serialVersionUID原理分析

  1. 序列化:序列化操作时会将serialVersionUID写入到序列化文件
  2. 反序列化:反序列化时系统自动检测文件中的serialVersionUID,检测同当前类的 serialVersionUID是否相同,
    相同说明版本一致,则进行反序列化,否则报异常,反序列化失败

serialVersionUID生成方式

  1. 生成方式1:
    直接定义一个serialVersionUID值
    private static final long serialVersionUID = xxxxL;
  2. 生成方式2:
    通过一些方法计算出,如:根据包名,类名,继承关系,私有方法,属性及参数信息计算出一个serialVersionUID值

serialVersionUID 何种情况会提示信息

当一个类实现类Serializable接口,
但是此时如果我们没有定义serialVersionUID
此时Eclipse会自动给出相应的提醒

serialVersionUID 注意事项

当我们实现java.io.Serializable接口时,未显式定义serialVersionUID变量时,
JAVA序列化机制会根据Class自动生成一个serialVersionUID作序列化版本比较用,
但是这种情况下,serialVersionUID不会变化

serialVersionUID 应用示例说明

 
package com.java265.entity.serializable;
 
import java.io.Serializable;
 
public class Persion implements Serializable {
 
    private static final long serialVersionUID = 20210811111L;
    public Long id;
    public String name;
    public final String userName;
 
    public Persion(Long id, String name){
        this.id = id;
        this.name = name;
        userName = "java265";
    }
 
    public String toString() {
        return id.toString() + "--" + name.toString();
    }
}



/*序列化操作*/

package com.java265.entity.serializable;
 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
 
public class SerialTest {
 
    public static void main(String[] args) {
        Persion p = new Persion(1L, "毛毛");
        System.out.println("person Seria:" + p);
        try {
            FileOutputStream fos = new FileOutputStream("Persion.txt");
            ObjectOutputStream t = new ObjectOutputStream(fos);
            t.writeObject(p);
            t.flush();
            t.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



/*反序列化功能*/


package com.example.demo.entity.serializable;
 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
 
public class DeserialTest {
 
    public static void main(String[] args) {
        Persion p;
        try {
            FileInputStream fis = new FileInputStream("Persion.txt");
            ObjectInputStream t2 = new ObjectInputStream(fis);
            p = (Persion) t2.readObject();
            t2.close();
            System.out.println(p.toString());
            System.out.println(p.userName);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

运行结果分析:
  1.当Persion类序列化为Persion.txt之后
 我们此时修改 Persion类 中的serialVersionUID,
 然后反序列化,此时由于serialVersionUID不一致,会出现以下错误信息
java.io.InvalidClassException: com.java265.entity.serializable.Persion; local class incompatible: stream classdesc serialVersionUID = 20210811111, local class serialVersionUID = 2222
	at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:616)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1843)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1713)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2000)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
	at com.java265.entity.serializable.DeserialTest.main(DeserialTest.java:26)


2.当serialVersionUID相同时,则会输出相应结果信息
Person DeserialPerson:1--毛毛

版权声明

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

本文链接: https://www.Java265.com/JavaProblem/202108/661.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

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

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者