一、基础序列化
在网络传输过程中,需要将对象进行序列化后才能进行传输,序列化就是按照一定的标准进行转码的过程。在序列化与反序列化过程中对serialVersionUID 属性进行维护,相当于转码的标准。一般有两种方法,一是指定值,二是默认由系统根据字段,方法等,计算得到此属性。
需要注意的有两点:
1.transient关键字修饰的属性,不进行序列化。
2.static关键字修饰的属性,不进行序列化。
被声明为static的属性不会被序列化,这个问题可以这么理解,序列化保存的是对象的状态,但是static修饰的变量是属于类的而不是属于变量的,因此序列化的时候不会序列化它
二、自行实现序列化
java默认的序列化方法有安全问题,所以在有些敏感信息需要自行序列化。
具体的需要自己写writeObject和readObject 方法。
三、复杂序列化情况(易出bug)
1、当父类继承Serializable接口时,所有子类都可以被序列化
2、子类实现了Serializable接口,父类没有,父类中的属性不能序列化(不报错,数据丢失),但是在子类中属性仍能正确序列化
3、如果序列化的属性是对象,则这个对象也必须实现Serializable接口,否则会报错
4、反序列化时,如果对象的属性有修改或删减,则修改的部分属性会丢失,但不会报错
5、反序列化时,如果serialVersionUID被修改,则反序列化时会失败
参考:https://www.cnblogs.com/szlbm/p/5504166.html
原文:https://www.cnblogs.com/Junpb/p/10760565.html