很显然这行代码的意思是将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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)