Serializable & transient

serialize是什么意思?
  这个词,在中文中翻译为串行化或者序列化。这两个翻译应该说几乎都无法表达它的实际意义。如果你原本不懂,给你翻译了,你还是不懂。
  事实上这是IO存储中的一个概念。计算机中所有的内容都是0或者1的数字这一点,我想现在可能连五岁顽童也是知道的。这些数字按顺序排列,便可以表示计算机中的万事万物,当然Java的对象也不例外。在内存中,无论如何表示,对我们的操作都没有影响,所以我们不必关心。但是,当我们需要把对象存储到硬盘、数据库或其它相关介质时,我们就需要考虑这个表示格式或者转化方法了。
  那么Java的对象要如何转化为这0、1的序列呢?就是靠序列化。不过大家不必担心,Java在这方面很贴心,不需要你们自己去推敲转化算法,只需要使用java.io.ObjectOutputStream类即可完成复杂的转化工作。但ObjectOutputStream类可以支持的只有实现了Serializable接口的对象,如果没有实现Serializable接口,则会抛出NotSerializableException。

transient
  但是,在一个你希望序列化的类中,常常可能参杂了一些临时性成员变量或者一些你并不希望它们被存储下来的属性,这些成员变量或者属性,就需要用transient关键字修饰。它们会在序列化时被忽略。当从存储介质中读取并还原成对象时,他们会被还原为属性的默认值(基本类型为0或false,对象为null)。
  这就是有关Java中的serialize的一个概述。详细内容可以参考Sun Java Tutorial中关于IO的一章。

为什么项目中的所有Java Bean都要实现Serializable接口?
  这一点要从WebSphere Application Server(以下简称WAS)的Session共享机制说起。在日本的环境上,WAS服务器是互为备份的两台,通过负载均衡dispatcher来分配客户端发来的请求。Session在Web开发中是一个极其重要的存储单位,与用户相关的内容,常常存储在服务器端的Session容器中。如果仅有一台WAS服务器,Session容器仅建立在内存中即可,但当有两台互为备份的WAS服务器时,它们必须共享Session才可以让客户端感觉不出服务器的切换过程。而Session的共享显然无法通过内存实现,必须使用外部存储设备。在WAS中,常用的方法是将Session存储在数据库中。这时,就需要将Session进行序列化,也势必会开始序列化所有Session中存储的内容。为了让这一操作正常进行,所有可能存储在Session中的Java Bean都必须支持序列化,也就必须实现Serializable接口。
  由此可见,并不是所有的Java Bean都需要实现Serializable接口,而只是可能放在Session中的Java Bean有这个必要。但当年项目中的经验型技术高手没有确切地分析清楚问题的根本原因,所以只能根据经验想出了一个权宜之计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值