一 系列化(Serialize)是干什么的?
这是IO存储中的一个概念。计算机中所有的内容都是0或者1的数字。这些数字按顺序排列,便可以表示计算机中的万事万物,当然Java的对象也不例外。在内存中,无论如何表示,对我们的操作都没有影响,所以我们不必关心。但是,当我们需要把对象存储到硬盘、数据库或其它相关介质时,我们就需要考虑这个表示格式或者转化方法。
Java的对象要如何转化为这0、1的序列呢?就是靠序列化,使用java.io.ObjectOutputStream类即可完成复杂的转化工作,但ObjectOutputStream类可以支持的只有实现了Serializable接口的对象,如果没有实现Serializable接口,则会抛出NotSerializableException。你希望序列化的类中,常常可能参杂了一些临时性成员变量或者一些你并不希望它们被存储下来的属性,这些成员变量或者属性,就需要用transient关键字修饰。它们会在序列化时被忽略。当从存储介质中读取并还原成对象时,他们会被还原为属性的默认值(基本类型为0或false,对象为null)
序列化简单来说就保存对象在内存中的状态也可以说是实例化变量。这是Java提供的用来保存 Object state,一种保存对象状态的机制。只有实现了serializable接口的类的对象才能被实例化。
二,什么情况下会用到序列化?
1当你想把内存中的对象写入到硬盘时
2当你想用套接字在网络上传输对象时
3当你想通过RMI调用对象时
(RMI是什么东西?):RMI总结来说就是远程调用对象,在一个jvm上调用另一个jvm的对象。
三 序列化需要注意的事项
1序列化只保存对象的状态,而不管对象的方法。
2当一个父类实现了序列化,它的子类也自动实现序列化,不用显示进行实现了。
3当一个实例对象引用其他对象,当序列化该对象时也把引用的对象进行了实例化。
个人总结:serializable接口就是Java提供用来进行高效率的异地共享实例对象的机制,实现这个接口即可。
四 JavaBean为什么要实现java.io.Serializable接口实现序列化?
-
public interface Serializable {
-
}
客户端访问了某个能开启会话功能的资源, web服务器就会创建一个与该客户端对应的HttpSession对象,每个HttpSession对象都要站用一定的内存空间。如果在某一时间段内访问站点的用户很多,web服务器内存中就会积累大量的HttpSession对象,消耗大量的服务器内存,即使用户已经离开或者关闭了浏览器,web服务器仍要保留与之对应的HttpSession对象,在他们超时之前,一直占用web服务器内存资源。
web服务器通常将那些暂时不活动但未超时的HttpSession对象转移到文件系统或数据库中保存,服务器要使用他们时再将他们从文件系统或数据库中装载入内存,这种技术称为Session的持久化。
将HttpSession对象保存到文件系统或数据库中,需要采用序列化的方式将HttpSession对象中的每个属性对象保存到文件系统或数据库中;将HttpSession对象从文件系统或数据库中装载如内存时,需要采用反序列化的方式,恢复HttpSession对象中的每个属性对象。所以存储在HttpSession对象中的每个属性对象必须实现Serializable接口。当然如果不是存储在session中的JavaBean可以不用存储哈。
好处:
a)比如说你的内存不够用了,那计算机就要将内存里面的一部分对象暂时的保存到硬盘中,等到要用的时候再读入到内存中,硬盘的那部分存储空间就是所谓的虚拟内存。在比如过你要将某个特定的对象保存到文件中,我隔几天在把它拿出来用,那么这时候就要实现Serializable接口;
b)在进行java的Socket编程的时候,你有时候可能要传输某一类的对象,那么也就要实现Serializable接口;最常见的你传输一个字符串,它是JDK里面的类,也实现了Serializable接口,所以可以在网络上传输。
c)如果要通过远程的方法调用(RMI)去调用一个远程对象的方法,如在计算机A中调用另一台计算机B的对象的方法,那么你需要通过JNDI服务获取计算机B目标对象的引用,将对象从B传送到A,就需要实现序列化接口。