序列化接口主要从两方面来说明:
1.为什么要实现空接口Serializable
a.首先实现空接口目的是为了做序列化标识,标注该接口为序列化接口;
b.一般音频、文件传输要序列为二进制流进行传输;而我们java对象想要完整的传输,就可以通过对象序列化来完成;
c.当你想把的内存中的对象写入到硬盘的时候;当你想用套接字在网络上传送对象的时候;当你想通过RMI传输对象的时候;就需要序列化对象;
注:
a)比如说你的内存不够用了,那计算机就要将内存里面的一部分对象暂时的保存到硬盘中,等到要用的时候再读入到内存中,硬盘的那部分存储空间就是所谓的虚拟内存。在比如过你要将某个特定的对象保存到文件中,我隔几天在把它拿出来用,那么这时候就要实现Serializable接口;
b)在进行java的Socket编程的时候,你有时候可能要传输某一类的对象,那么也就要实现Serializable接口;最常见的你传输一个字符串,它是JDK里面的类,也实现了Serializable接口,所以可以在网络上传输。
c)如果要通过远程的方法调用(RMI)去调用一个远程对象的方法,如在计算机A中调用另一台计算机B的对象的方法,那么你需要通过JNDI服务获取计算机B目标对象的引用,将对象从B传送到A,就需要实现序列化接口。
d.序列化能把堆内存中的对象的生命周期延长,做持久化操作.当下次再需要这个对象的时候,我们不用new了,直接从硬盘中读取就可以了;
①在很多框架中就会有这种.object结尾的文件,因为很多对象都不创建,创建起来太麻烦,直接读取,而且有些对象的值你不知道,框架封存在.object文件中,直接读取这个文件中的这个值就行了,不需要传这个值.
在搞web开发的时候一些类就需要实现序列化接口,因为服务器就会对你的对象进行临时本地存储.它怕服务器崩了的以后,你的会话都被消失了.所以存储在了硬盘上,你重新启动服务器会恢复之前的会话,恢复对象,你之前运行的东西都在.
②对某些特点的对象,比如数据库连接对象,存储特定数据的对象
,这样对象你不想创建他们,想存储起来,让他们的生命周期延长,可以把他们放在硬盘当中.每次系统启动的时候都到.object中读取对象和里面的数据,这个时候就可以把他们序列化来完成.
2.为什么要加UID
在序列化的时候系统将serialVersionUID写入到序列化的文件中去,当反序列化的时候系统会先去检测文件中的serialVersionUID是否跟当前的文件的serialVersionUID是否一致,如果一直则反序列化成功,否则就说明当前类跟序列化后的类发生了变化,比如是成员变量的数量或者是类型发生了变化,那么在反序列化时就会发生crash,并且回报出错误;
所以如果固定了UID,这个字段的作用显而易见,假如我们升级了系统,在User当中增加了字段属性,那么我们在手动添加了serialVersionUID之后,我们在进行序列化和反序列化的时候就会很从容,就不会再出现crash的情况了。
另外强调两点,静态成员变量属于类不属于对象所以不参与序列化的过程,还有如果使用transient标记的成员变量不参与序列化过程。