Java serialVersionUID 序列化

本文介绍了Java中serialVersionUID的作用,它是序列化和反序列化过程中版本校验的关键。当类序列化时,serialVersionUID会被写入文件,反序列化时系统会对比这个值以确保类版本的一致性。如果没有显式声明,系统会默认生成1L,但为了应对类变更导致的不兼容问题,通常推荐根据类信息生成特定的哈希值作为serialVersionUID。Java对象的序列化主要应用于持久化存储和网络传输。在JavaEE开发中,如Tomcat的session持久化和JDBC驱动加载,都涉及到对象的序列化和反序列化操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

serialVersionUID 

serialVersionUID:序列化和反序列化过程中进行核验的一个版本号

serialVersionUID适用于Java的序列化机制。

可序列化类可以通过声明名为 serialVersionUID的字段显式声明自己的 serialVersionUID,且该字段必须是static,final的且类型为long。

Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的。

具体的序列化过程是这样的:序列化操作的时候系统会把当前类的serialVersionUID写入到序列化文件中,当反序列化时系统会去检测文件中的serialVersionUID,判断它是否与当前类的serialVersionUID一致,如果一致就说明序列化类的版本与当前类版本是一样的,可以反序列化成功,否则失败。

serialVersionUID有两种显示的生成方式:        
一是默认的1L,比如:private static final long serialVersionUID = 1L;        
二是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:        
private static final  long   serialVersionUID = xxxxL;

一些java类中为什么需要重载 serialVersionUID 属性

在Java中,软件的兼容性是一个大问题,尤其在使用到对象串行性的时候,那么在某一个对象已经被串行化了,可是这个对象又被修改后重新部署了,那么在这种情况下, 用老软件来读取新文件格式虽然不是什么难事,但是有可能丢失一些信息。serialVersionUID来解决这些问题,新增的serialVersionUID必须定义成下面这种形式:

private static final long serialVersionUID = 1L;

其中数字后面加上的L表示这是一个long值。 通过这种方式来解决不同的版本之间的串行化(序列化)问题。 

把对象转换为字节序列的过程称为对象的序列化

把字节序列恢复为对象的过程称为对象的反序列化

序列化是将对象的状态信息转换为可以存储或传输的形式的过程。

对象的序列化主要有两种用途:

   1.把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中

   2.在网络上传送对象的字节序列

Java编程中的序列化

把一个Java对象写入到硬盘或者传输到网络上面的其它计算机,这时我们就需要自己去通过java把相应的对象写成转换成字节流。对于这种通用的操作,就出现了java的序列化的概念。在Java的OutputStream类下面的子类ObjectOutputStream类就有对应的WriteObject(Object object) 其中要求对应的object实现了java的序列化的接口。

在使用tomcat开发JavaEE相关项目的时候,我们关闭tomcat后,相应的session中的对象就存储在了硬盘上,如果我们想要在tomcat重启的时能够从tomcat上面读取对应session中的内容,那么保存在session中的内容就必须实现相关的序列化操作,还有jdbc加载驱动用的就是反序列化,将字符串变为对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值