【湿货】Java序列化

292 阅读2分钟

以前没看懂别人为什么总是代码上会多那么一行

private static final long serialVersionUID = -9019828215585942431L;

最近在写redis的时候,才发现这东西是用来作序列化的。 至于序列化是什么东西呢。

serialVersionUID: 字面意思上是序列化的版本号,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量private static final long serialVersionUID

  1. serialVersionUID有两种生成方式: 采用默认的,这种方式生成的serialVersionUID是1L,例如:private static final long serialVersionUID = 1L; 根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,例如:private static final long serialVersionUID = 4603642343377807741L;
  2. 那么serialVersionUID(序列化版本号)到底有什么用呢? serialVersionUID存在的目的是序列化对象版本控制,有关各版本反序列化时是否兼容。 如果在新版本中serialVersionUID值修改了,新版本就不兼容旧版本,反序列化时会抛出InvalidClassException异常。 如果修改较小,比如仅仅是增加了一个属性,希望向下兼容,老版本的数据都能保留,那就不用修改; 如果修改较大,比如删除了一个属性或者更改了类的继承关系,必然不兼容旧数据,这时就应该手动更新版本号。

idea可以自动的生成serialVersionUID,只需要打开。 idea -> seting -> inspections -> 搜索 serialVersionUID 找到 Serializable class without serialVersionUID点亮即可

对于每一个entity我通常都是序列化的,因为在redis储存对象时,是需要将对象序列化的。 所以每一个entity都实现Serializable接口,然后Enter+alt,让他自己生成一个UID即可。