内存中的对象进行持久化或网络传输,都需要序列化和反序列化
将对象转为json字符串传给前端,mybatis插入属性值时都进行了序列化,这些String、Integer等对象都实现了Serializable接口,在Java中实现了Serializable接口后, JVM会在底层帮我们实现序列化和反序列化,但被transient关键字修饰的属性 和 被static修饰的属性不会被序列化
实现了Serializable接口,为什么还要显示指定serialVersionUID的值?
-
如果不显示指定
serialVersionUID, JVM在序列化时会根据属性自动生成一个serialVersionUID, 然后与属性一起序列化. 在反序列化时, JVM会再根据属性自动生成一个新版serialVersionUID, 然后将这个新版serialVersionUID与序列化时生成的旧版serialVersionUID进行比较, 如果相同则反序列化成功, 否则报错 -
如果显示指定了
serialVersionUID, JVM在序列化和反序列化时仍然都会生成一个serialVersionUID, 但值为我们显示指定的值, 这样在反序列化时新旧版本的serialVersionUID就一致了 -
在实际开发中我们的类会不断迭代, 一旦类被修改了, 那旧对象反序列化就会报错. 所以我们都会显示指定一个
serialVersionUID,值是多少无所谓, 只要不变就行