序列化
今天想看看SpringBoot集中处理Exception的注解,继承RuntimeException的时候点进去看了一下源码,发现有一个成员属性
查了一下这个serialVersionUID的用处,简单讲就是Java是以字节流传输对象的,如果使用字节流对象将一个引用对象传输入文件中,需要对对象做序列化,转换成字节的形式,而在反序列化的时候,会从反序列化读取到的字节流中查看这个serivalVersionUID和检测文件中的serivalVersionUID(想要反序列化成的类的class文件中的成员属性),如果一致,就说明可以转化,如果不一致就会抛出异常
当然,我们自定义的类想要进行序列化,需要实现Serializable接口,才能交付一系列序列化方法。但是不是必须要显示定义serivalVersionUID属性
只要在不同版本的Person类中定义相同的serivalVersionUID,都能序列化和反序列化,只是不含有的属性会被忽略
父类序列化和Transient关键字
transient关键字可以防止属性被序列化到文件后,反序列化之后,transient变量的值被设置为初始值
-
举一个场景例子,如果父类没有实现Serializable 接口,而子类实现了,序列化该子类对象,再反序列化后输出父类中定义的某变量的数值,这个数值是与序列化之前不相同的,因为父类的部分没有被序列化掉
-
而因为想要反序列化构造子类,就一定要先构造父类对象,所以这种场景下就会调用父类的默认无参构造方法来构造一个父类的对象