说一下个人理解总结,请先看完再往下看,会容易理解一些:(看完也可以不看下面的链接了)
以下为个人理解,如有误及时告知谢谢;
1,序列化和反序列化概念
答:序列化是为了在使对象可以转化为字节序列二进制数组,在I/O流中传输;
换句话说,不序列化无法转化为字节序列(可以理解为字节流的byte数组)进行传输;
序列化是指对象转化成字节序列(字节流的byte数组)的过程;
反序列化是指从字节序列(字节流的byte数组)转换成对象的过程;
属性问题:并且记住 static、transient 修饰的无法被序列化;final可以直接将值序列化(即可以理解为可以序列化);
transient 的小 tips:
1、变量被transient修饰,变量将不会被序列化
2、transient关键字只能修饰变量,而不能修饰方法和类。
3、被static关键字修饰的变量不参与序列化,一个静态static变量不管是否被transient修饰,均不能被序列化。
4、final变量值参与序列化,final transient同时修饰变量,final不会影响transient,一样不会参与序列化
2, Serializable 接口作用,也就是为啥要序列化
答:java规定的,需要实现这个接口才能序列化;简单说不实现就无法转换成字节序列(字节流的byte数组);
3,serialVersionUID 有什么用,不同数值有什么区别
答:实现序列化接口后,jdk会默认自动给我们匹配这个值;(对象变了、编译器变了,这个值也变了,就会认不出报错了)
我们自己写的、idea等工具生成的,数字不同没区别;只要序列化反序列化时别变就行;
这个值是必须是 static final long 的,最好设为private的,属性私有化;
以上为个人理解总结,具体测试可以参看大佬测试和解释: