问题1:序列化是什么?
答:就是java把一个类的实体化的对象存到硬盘,或传给千里之外的另一个人。就是把抽象的对象,存成一定的格式放到硬盘里。比如json的数据形式 算是键值对的形式,也是一种序列化的格式。大概就是这么个意思。
问题2:我不实现serializable接口行不行,一个空接口,你让我实现,逗我呢?
答:不行,序列化执行源码里进行了判定,三种类型:数组,Enum,serializable,不是这三个,不好意思,不给你序列化。为啥,不为啥,就像买包子,需要排队,你不排队,我不卖给你。序列化源代码如下:
问题3:我写了个类,好吧,我给你个面子实现serializable接口,但是,我就不写serialVersionUID,怎么着吧,我照样可以序列化,照样可以反序列化。
答:嗯,是可以不写这个serialVersionUID,你序列化了,也可以反序列化,但是有一个问题,你写了个类,今天你生成个对象存到硬盘中。明天你心情好,加个了个属性,想起昨天的那个对象,你想从硬盘中拿出来,一拿,报错,说serialVersionUID不一致,这是为啥?因为,你虽然类中没写serialVersionUID,系统说,好,你没写,我给你写一个。擦,写进去了。你拿的时候,带着类过来了,系统一看,你的类胖了1斤,根据规则生成了一个serialVersionUID值,多少呢,假如是2,为啥变了,因为你加东西了,所以根据规则生成的这个值就变了。一比对,不一样,系统说,你走吧,不是同一个人。然后就凉凉了。所以,如果类没有变,ok,给你存给你取。如果存的时候和拿的时候类变了,那就只给存不给拿了。说白了,就是控制版本的作用。所以,String里的这个UID的值,历经几代都不变。反序列化源码如下:
这个图片代码就是如果你没有UID,系统给你创建一个
问题4:哎呀,这个serialVersionUID的字段好长呀,行吧,我写,但是我不叫这个名字,我叫a,叫b,叫c,不叫这么长行不行?
答:不行。为啥,因为系统拿的时候,就拿这个名字的属性的值,写死了。你不叫这个名字,系统怎么知道。