Serializable接口
1.什么是Serializable接口
一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化。
2.什么是序列化
序列化是将对象的状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。两个过程结合起来,可以轻松完成存储和传输数据。
3. 为什么需要序列化
当我们需要把对象的状态信息通过网络进行传输,或者需要将对象的状态信息持久化,以便将来使用时都需要把对象进行序列化。
通过查看Serializable接口源码,发现其是一个空接口,什么都没有。我们可以将其理解为一个标识接口。在java中的这个Serializable接口就是给JVM看的,通知JVM,来序列化这个类。
4.serialversionUID变量
如果在继承Serializable接口时,没有定义UID变量,系统会默认生成一个UID。这样在反序列化时可能导致InvalidClassException异常。因此,在继承Serializable接口时,往往自定义一个UID值。
将一个对象写入文件中,然后再从文件中恢复,恢复的内容和之前一样,但是两者是不同的对象,如果没有自定义UID值,那么两次默认得到的UID值很有可能不同,导致反序列化失败。在序列化的时候系统将serialVersionUID写入到序列化的文件中去,当反序列化的时候系统会先去检测文件中的serialVersionUID是否跟当前的文件的serialVersionUID是否一致,如果一直则反序列化成功,否则就说明当前类跟序列化后的类发生了变化。