Effective java笔记8--序列化
对象的序列化(object serialization)API,它提供了一个框架,用来将对象编码成一个字节流,以及从字节流编码中重新构建对象。
一、谨慎地实现Serializable
要想使一个类的实例可被序列化,非常简单,只要它的声明中加入"implements
Serializable"即可。正因为太容易了,所以普遍存在这样一种误解:程序员只需要做极少的工作就可以支持序列化了。
因为实现Serializable而付出的最大代价是,一旦一个类被发布,则”改变这个类的实现“的灵活性将大大降低。当一个类的序列化形式Serialized form变成了它的导出的API的一部分。一旦这个类被广泛使用,那么必须要永远支持这种序列化形式,就好像你必须要支持所有其他部分导出的API一样。如果你没有精力来设计一个自定义的序列化形式(custom serialized form),而仅仅接受了默认的序列化形式,那么,这个类的序列化形式将永远束缚在该类最初的内部表示上。
序列化会使类的演化受到限制,这种限制的一个例子与刘的惟一标示符(Stream unique identifier)有关,通常它也被称为序列版本UID(serial version UID)。每一个可序列化的类都有一个惟一标识号与它相关联,如果你没有在一个名为SerialVersionUID的私有静态final的long域中显式地指定该标识号,那么系统会自动将一个确定性的复杂过程作用在这个类上,从而产生该标识号,这个自动产生的值会受到类名字,它实现的接口的名字、以及所有公有和受保护的成员的名字的影响。
实现Serializable的第二个代价是,它增加了错误(bug)和安全漏洞的可能性。因为反序列化过程必须要保证所有“由真正的构造函数建立起来的约束关系”,并且不允许攻击者能访问到正在构造过程中的对象的内部信息:依靠默认的反序列化机制很容易使对象的约束关系受到破坏,以及遭受非法访问。
实现Serializable的第三个代价是,随着一个类的新颁布的发行,相关的测试负担增加了。当一个可序列化的类被修订的时候,很重要的一点事,要检查是否可以“在新颁布中序列化一个实例,然后在老版本中反序列化”,或者相反的过程:异常,测试所需要的工作量与“可序列化的类的数量x版本数”的乘积成正比。
实现Serializable接口不是一个很轻松就可以做出的决定。
为了继承而设计的类应该很少实现Serializable,接口也应该很少会扩展它。
Effective java笔记8--序列化的更多相关文章
- Effective Java笔记一 创建和销毁对象
Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...
- effective java笔记之单例模式与序列化
单例模式:"一个类有且仅有一个实例,并且自行实例化向整个系统提供." 单例模式实现方式有多种,例如懒汉模式(等用到时候再实例化),饿汉模式(类加载时就实例化)等,这里用饿汉模式方法 ...
- Effective java笔记(二),所有对象的通用方法
Object类的所有非final方法(equals.hashCode.toString.clone.finalize)都要遵守通用约定(general contract),否则其它依赖于这些约定的类( ...
- effective java笔记之java服务提供者框架
博主是一名苦逼的大四实习生,现在java从业人员越来越多,面对的竞争越来越大,还没走出校园,就TM可能面临失业,而且对那些增删改查的业务毫无兴趣,于是决定提升自己,在实习期间的时间还是很充裕的,期间自 ...
- Effective java笔记(十),序列化
将一个对象编码成字节流称作将该对象「序列化」.相反,从字节流编码中重新构建对象被称作「反序列化」.一旦对象被「序列化」后,它的编码就可以从一台虚拟机传递到另一台虚拟机,或被存储到磁盘上,供以后「反序列 ...
- Effective java笔记(一),创建与销毁对象
1.考虑用静态工厂方法代替构造器 类的一个实例,通常使用类的公有的构造方法获取.也可以为类提供一个公有的静态工厂方法(不是设计模式中的工厂模式)来返回类的一个实例.例如: //将boolean类型转换 ...
- Effective java笔记(六),方法
38.检查参数的有效性 绝大多数方法和构造器对于传递给它们的参数值都会有限制.如,对象引用不能为null,数组索引有范围限制等.应该在文档中指明所有这些限制,并在方法的开头处检查参数,以强制施加这些限 ...
- effective java 笔记1--序言
一.序言 程序设计的几条基本原则: 1.清晰性和简洁性最为重要,模块的用户永远也不应该被模块的行为所迷惑,所以写良好的注释是必需的. 2.模块要竟可能小,但也不能太小,好一个深奥的哲学问题. 3.代码 ...
- Effective Java笔记
chapter 1 java支持四种类型:interface,class,array,primitive(基本类型) chapter 2 创建对象方式: ①构造器 ②静态工厂方法代替构造器:名称可以按 ...
- Effective java -- 9 并发/序列化
关于同步的问题,想弄明白java,同步不会是不行的.这不书弄完后还会从<java并发编程实战>和<java并发编程的艺术>选一本或者都看. 第六十六条:同步访问共享的可变数据说 ...
随机推荐
- 让ie6也支持max-width,和max-height实现图片等比例缩放
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- React状态的含义和用法
一. 二.代码 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=&quo ...
- Java-马士兵设计模式学习笔记-桥接模式
一.概述 1.桥接模式的应用情况:(1)两个维度扩展(2)排列组合 二.代码 1.Gift.java public class Gift { protected GiftImpl giftImpl; ...
- 关于JLINK固件丢失或升级固件后提示Clone的解决办法
本人用的JLINK仿真器(某宝上买的),在使用新版KEIL时,提示要升级固件,升级后就出现JLINK is Clone的提示.在网上找了许多关于修复的资料,都觉得不是很好.经过本人反复试验,总算找到比 ...
- Highcharts属性详解
Highcharts的基本属性和方法详解 Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学 ...
- android学习笔记二:Intent
1.Intent作用 协助完成各个组建间的通信.如activity间.启动service.Broadcast. 2.Intent构成 1.Componet name:要启动的目的组建. 2.Actio ...
- VNC常用操作及常见问题解决办法汇总
VNC登录用户缺省是root,但在安装oracle时必须用oracle用户的身份登录,下面我们就以oracle为例说明如何配置VNC,从而可以使用不同的用户登录到主机.步骤描述如下: 步骤一:修 ...
- SPOJ 227 Ordering the Soldiers 线段树 / 树状数组
题意:设原数组为a[i],pos[i]代表第 i 个位置之前有多少个数比a[i]大,求原数组a[i]. 这个题意是看了别人的题解才明白,我自己没读出来…… 方法:假设我们从左往右放,因为后面的数还有可 ...
- 8021x 获取IP信息失败,请检查锐捷认证客户端当前配置是否符合所在网络的要求,检查完毕后尝试重新认证
早上一起床,登陆锐捷客户端上网,谁知道错问题了.不能联网了,锐捷登陆成功,但是一会儿就提示失败,获取IP信息失败了.下面我描述一下问题原因: 锐捷登陆后有认证提示,和往常正常情况一样的,不过有个小感叹 ...
- [原]zoj3772--【水题】线段树区间查询+矩阵乘法
思路来源:http://blog.csdn.net/u013654696/article/details/23037407#comments [做浙大校赛的时候没有看这道题,事后做的.思路不是自己的, ...