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加载驱动用的就是反序列化,将字符串变为对象。