先来说说序列化,序列化是把内存中的对象转变成二进制的数据,通过这种形式才能存储到硬盘或者发送给别人。
再来说说反序列化,由于硬盘和网络都只认识二进制的0和1,不认识Java对象,所以必须进行转换,把二进制的数据变回内存中的对象。
在具体的实现细节上,有怎么做、怎么防、怎么稳这3个问题面试官比较喜欢问。
对于怎么做这个问题,一个类要想实现序列化,就必须实现Serializable接口,这个接口就相当于一个许可证。
至于怎么防,如果有些像密码这种的字段,它不想被保存下来,我们可以通过加上一个transient关键字,这样的话,序列化的时候就会自动跳过这些字段。
对于怎么稳,为了防止你修改了代码之后,在读取旧数据时发生报错,可以加上一个serialVersionUID版本号,这个版本号就相当于一个文件的身份证或者指纹。
这个serialVersionUID可以用来验证序列化的对象和反序列化之后对应的对象的ID两者是否一致。
举个例子说明一下:
比如,如果在没有定义一个serialVersionUID的前提下,接着序列化一个对象,在反序列化之前,在对象中增加了一个成员变量使得对象的类结构发生了改变,这个时候进行反序列化就会失败。原因就是serial VersionUID已经不一致了。