private static final long serialVersionUID = 1L

很显然这行代码的意思是将SerialVersionUID的值定义为一个常量,那这是干什么的呢?

解决这个问题,首先要了解包含SerialVersionUID的Serializable接口是什么?

Serializable:一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化。Serializable是java.io包中定义的、用于实现Java类的序列化操作而提供的一个语义级别的接口。Serializable序列化接口没有任何方法或者字段,只是用于标识可序列化的语义。

实现了Serializable接口的类可以被ObjectOutputStream转换为字节流,同时也可以通过ObjectInputStream再将其解析为对象。例如,我们可以将序列化对象写入文件后,再次从文件中读取它并反序列化成对象,也就是说,可以使用表示对象及其数据的类型信息和字节在内存中重新创建对象。

下一个问题,什么是序列化?

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以用管道来传输到系统的其他程序中。

最后一步,为什么要定义这个serialVersionUID呢?

serialVersionUID叫做流标识符,即类的版本定义,作用是在序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。jvm在反序列化的时候先去对比这个版本名字,如果数据流中的serialVersionUID和类中的serialVersionUID相同,才会进行反序列化,而不同的话就会抛出异常。一般来说,如果你对一个实现了serializable接口的类进行修改之后,需要修改这个版本信息。serialVersionUID可以显示声明也可以隐式声明。隐式声明是通过包名,类名等多个因素计算出来的,而显示声明就是通过赋值自己设置。

如果你不写private static final long serialVersionUID = 1L,在对这个类进行修改时,若你忘记修改serialVersionUID,版本上就会出现不兼容的问题,于是就会出现反序列化报错的情况

如果你显示定义了private static final long serialVersionUID = 1L,在对这个类进行修改时,若你忘记修改serialVersionUID,这个类也能被进行反序列化,它就会自动向上兼容版本,不会报错。
 

参考文章:
        

        原文链接:https://blog.csdn.net/dancheguiji/article/details/80578020

  • 20
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值