理解serialVersionUID是什么?有什么用?如何生成?-程序员宅基地

技术标签: java  Java基础  后端  开发语言  

1、什么是serialVersionUID?
serialVersionUID用作Serializable类中的版本控件。如果您没有显式声明serialVersionUID,JVM将根据您的Serializable类的各个方面自动为您执行此操作,如[Java(TM)对象序列化规范中所述](http://docs.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html)。

2、SerialVersionUID示例

3、相同的serialVersionUID,在反序列化过程中没有问题
在Address.java中,将serialVersionUID更改为2L(它是1L),然后再次编译它。
“ InvalidClassException”会引发,因为您使用serialVersionUID“1L”编写了一个序列化类,但尝试使用更新的序列化类serialVersionUID“2L”将其检索回来。

4、什么时候应该更新你的serialVersionUID?
如果使用对可序列化类的某些不兼容的Java类型更改更新序列化类,则必须更新serialVersionUID。

5、默认的serialVersionUID有什么问题?
如果没有声明serialVersionUID,JVM将使用自己的算法生成默认的SerialVersionUID,您可以在[此处](http://docs.oracle.com/javase/6/docs/platform/serialization/spec/class.html#4100)检查算法。默认的serialVersionUID计算对类详细信息非常敏感,可能因不同的JVM实现而异,并且在反序列化过程中会导致意外的InvalidClassExceptions。

6、如何生成serialVersionUID
实现Serializable接口,然后在IDEA使用如下方法:
1、打开Preferences–>Editor–>Inspections,然后在右侧输入UID进行搜索(搜索方式比较快,也可以在java–>Serialization issues里找)。然后勾选Serializable class without 'serialVersionUID'后面的复选框。右侧Severity默认Warning即可。如下图:

以下为可运行示例代码:


package com.wenxiaowu.reflect;

import org.junit.Test;

import java.io.*;

/**
 * 理解serialVersionUID
 */
public class SerializableTest {
    @Test
    public void testWrite() {
        Address address = new Address();
        address.setStreet("wall street");
        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); // Street : wall street
        } 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(" Street : ")
                    .append(this.street)
                    .toString();
        }
    }

}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yangbindxj/article/details/122567226

智能推荐

11.2 RAC: In "crsctl stat res -t" State Details May Be Missing or Incorrect (文档 ID 1086563.1)_crsctl stat res -t ora.asm state_details-程序员宅基地

文章浏览阅读597次。11.2 RAC: In "crsctl stat res -t" State Details May Be Missing or Incorrect (文档 ID 1086563.1)转到底部In this Document Symptoms Cause Solution Refe_crsctl stat res -t ora.asm state_details

promise的优点promise.all(),promise.race(),promise.allSettled()的原理_promise.all的优点-程序员宅基地

文章浏览阅读1.2k次。Promise也是使用回调函数,只不过是把回调封装在了内部,使用上一直通过 then 方法的链式调用,使得多层的回调嵌套看起来变成了同一层的,书写上以及理解上会更直观和简洁一些。Promise出现之前都是通过回调函数来实现,回调函数本身没有问题,但是嵌套层级过深,很容易掉进回调地狱。1、promise.all()Promise.all()方法接受一个数组作为参数,p1、p2、p3都是 Promise 实例只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulf..._promise.all的优点

Poj 1733 Parity Game(离散化+并查集)_poj1733-程序员宅基地

文章浏览阅读665次。题目大意:给出n个数字,m个区间内的数字和的奇偶性,询问从哪句话开始出现错误。1.对于给定区间[l , r]的奇偶性,可以转化为[1. l-1]和[1, r]的奇偶性“关系”,这样就可以用带权并查集来做了,权值为当前结点与根节点的奇偶性关系,每次查询如果l,r根结点相同,那么判断这句话是否正确,如果根节点不同,那么合并。2.由于这道题数据量很大,但是查询只有m(m_poj1733

将本地镜像上传到Docker hub_本地docker镜像上传dockhub-程序员宅基地

文章浏览阅读2.4k次。一、准备工作1.注册账号注册一个Docker Hub账号,管理自己的镜像(共享镜像)https://hub.docker.com2.新建一个仓库Docker hub上面创建仓库,仓库用于存放镜像,就像我们在Github Create Create Repository比如:仓库名称叫navigation-server,所以路径就是liyinchi/navigation-server了。注意:仓库名称只能小写3.查看容器IDdocker ps上传到Doc._本地docker镜像上传dockhub

elementUI动态切换校验规则且切换校验规则时清空上一次校验产生的警告文字_ele 切换后清除校验-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏8次。**this.$refs.transformerForm.clearValidate(['transformerLVSRateCapacity'])**清除切换校验时上一次校验留下的警告文字,<el-form :model="transfomerInfo" :rules="rules" ref="transformerForm" label-width="170px"> <el-form-item label="低压侧容量(MVA):" prop="transformer..._ele 切换后清除校验

vulhub靶场struts2漏洞复现_vulhub靶场有哪些漏洞-程序员宅基地

文章浏览阅读2k次。0x01、S2-001远程代码执行漏洞原理该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行影响版本Struts 2.0.0 - Struts 2.0.8poc执行任意命令%{#a=(new java.lan_vulhub靶场有哪些漏洞

随便推点

人生苦短,我用python,这些可以吊打面试官的题目你值得拥有!_mid = json.loads(message)['mid']-程序员宅基地

文章浏览阅读3.4w次,点赞5次,收藏17次。前言:期待的是可以检验自己学习的成功;苦逼的是怎么又有东西没记住,但我们依然每天坚持一遍、一遍又一遍指导记住为止。“一个人能驾驭自律的能量,就会变得势不可挡,就像大自然的力量。不再需要替毫无进展找借口。并在未来几个月和几年中,完成许多人一辈子做不到的事。” ──布莱恩·崔西语言特性 1. 谈谈对 Python 和其他语言的区别 答:Python 是一门语法简洁优美,功能强大无比,应用领域非常广泛,具有强大完备的第三方库,他是一门强类型的可移植、可扩展,可嵌入的解释型编程语言,属于动态语言。 拿_mid = json.loads(message)['mid']

java空值转datetime,将字符串“ yyyy-MM-dd”转换为LocalDateTime-程序员宅基地

文章浏览阅读1.2k次。有什么办法转换的日期String到LocalDateTime了格式"yyyy-MM-dd"?如果我尝试这样做:DateTimeFormatter DATEFORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");LocalDateTime ldt = LocalDateTime.parse(string, DATEFORMATTER);我有这个例外..._yyyy-mm-dd 转localdatetime

【转】BMP图像文件存储结构(1)_windows图片存储结构-程序员宅基地

文章浏览阅读1.3k次。在未得到原作者的同意下转载,特地在此贴出源地址以作声明:http://wmnmtm.blog.163.com/blog/static/38245714201062355028288/-------------------------------华丽的分割线----------------------------BMP文件存储结构的格式可以在Windows中的WINGDI.h文件中找_windows图片存储结构

python 深拷贝deepcopy效率低及提速方法_copy.deepcopy 很慢-程序员宅基地

文章浏览阅读3.2k次。deepcopy是对对象的引用的引用对象都进行递归copy,为了防止递归溢出,deepcopy会记录每次已经copy的对象,所以增加了存储操作复杂度,从而影响执行效率。提速方法:1.采用pickle模块进行序列化和反序列化import copyimport pickleimport timeitclass A: def __init__(self): self.array = [1,2,3]def cp(): a = A() for i in rang_copy.deepcopy 很慢

mysql学生管理系统背景_学生基本系统管理-程序员宅基地

文章浏览阅读6.5k次,点赞4次,收藏27次。学生个人信息管理系统一、课题研究背景随着我国教育产业的飞速发展,社会对教育水平和教学管理软硬件的要求日益提高,尤其是对一个学校能够具有一套完善的教学管理软件提出了更多的要求。为了适应这种形式,教育系统尤其是大学不仅首先要有坚实的硬件基础,还要有一套完善的教学管理软件管理系统。而要实现这一功能,就要要求学校管理者配备一套高效的教育管理网络系统,以便在学校里实施良好的一套完善的管理且以最快的速度响应教..._学生管理系统的项目背景

linux添加定时任务清理日志文件_ls $removedir-程序员宅基地

文章浏览阅读625次。#!/bin/bash#日志目录RemoveDir=/home/redis/software/test#定义删除的日期yyyy-MM-dddt=`date +%Y-%m-%d -d "1 year ago"` for subdir in `ls $RemoveDir`;do if [ "${subdir}" \< "${dt}" ]; then rm -rf $RemoveDir/$subdir >/dev/null ec._ls $removedir

推荐文章

热门文章

相关标签