JavaBean为何要实现序列化?

我不知道在别人看来,我是什么样的人;但在我本身看来,我不过就象是一个在海滨玩耍的小孩,为不时发现比寻常更为光滑的一块卵石或比寻常更为美丽的一片贝壳而沾沾自喜,而对于展示在我面前的浩瀚的真理的海洋,却全然没有发现。java

——牛顿web

先说一个场景数据库

例如:客户端访问了某个能开启会话功能的资源, web服务器就会建立一个与该客户端对应的HttpSession对象,每一个HttpSession对象都要站用必定的内存空间。若是在某一时间段内访问站点的用户不少,web服务器内存中就会积累大量的HttpSession对象,消耗大量的服务器内存,即便用户已经离开或者关闭了浏览器,web服务器仍会按必定的规则保留与之对应的HttpSession对象,在他们超时以前,一直占用web服务器内存资源。api

 

这时Session的持久化技术就出现了:数组

Session的持久化就是web服务器一般将那些暂时不活动但未超时的HttpSession对象转移到文件系统或数据库中保存,服务器要使用他们时再将他们从文件系统或数据库中装载入内存。浏览器

这时又冒出一个问题:对象的储存、网络中传输 要怎么搞?服务器

答案也是显而易见的,最简单的方式就是,咱们的主题Serializable序列化来解决网络

 

接着说下三个方面说下Serializable对象

1、概念:继承

序列化:把对象转换为字节序列的过程称为对象的序列化。

反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

2、功能:

就是任何类型只要实现了Serializable接口,就能够被保存到文件及数据库中,或者做为数据流经过网络发送到别的地方,固然也能够用管道来传输到系统的其余程序中。

也就是说:一、当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;

二、当你想用套接字在网络上传送对象的时候;

三、当你想经过RMI传输对象的时候;

均可以用序列化来实现,贴近主题

3、JavaBean序列化机制:

JavaBean序列化机制就是把内存中的JavaBean转换成字节流 (一组byte[ ]) ,这样JavaBean序列化后能够很方便的存储或者在网络中传输。

在反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,若是相同就认为是一致的,能够进行反序列化,不然就会出现序列化版本不一致的异常。

 

加点料:

api 文档里面关于 serialVersionUID 的描述:

序列化运行时使用一个称为 serialVersionUID 的版本号与每一个可序列化类相关联,该序列号在反序列化过程当中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。若是接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不一样,则反序列化将会致使 InvalidClassException。可序列化类能够经过声明名为 "serialVersionUID" 的字段(该字段必须是静态 (static)、最终 (final) 的 long 型字段)显式声明其本身的 serialVersionUID:

若是可序列化类未显式声明 serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认 serialVersionUID 值,如“Java(TM) 对象序列化规范”中所述。不过,强烈建议 全部可序列化类都显式声明 serialVersionUID 值,缘由是计算默认的 serialVersionUID 对类的详细信息具备较高的敏感性,根据编译器实现的不一样可能千差万别,这样在反序列化过程当中可能会致使意外的 InvalidClassException。所以,为保证 serialVersionUID 值跨不一样 java 编译器实现的一致性,序列化类必须声明一个明确的 serialVersionUID 值。还强烈建议使用 private 修饰符显示声明 serialVersionUID(若是可能),缘由是这种声明仅应用于直接声明类 -- serialVersionUID 字段做为继承成员没有用处。数组类不能声明一个明确的 serialVersionUID,所以它们老是具备默认的计算值,可是数组类没有匹配 serialVersionUID 值的要求。

相关文章
相关标签/搜索