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并发编程的艺术>选一本或者都看. 第六十六条:同步访问共享的可变数据说 ...
随机推荐
- JTAG ARM-OB 被识别为盗版修复的方法
今天下了一个 Keil 的最新版 V4.70,打开工程,弹出个升级Jlink固件的对话框,也没仔细看,直接点了yes .这下爽了,升级之后弹出个对话框说我的Jlink是盗版的,然后工程自动关闭,很是无 ...
- Centos环境下部署游戏服务器-Eclipse
一直在想这篇文章该不该写,因为这篇文章更像是教你如何使用一个ide这种文章,毫无价值可言.但思来想去还是应给写.上篇文章主要说了编译原理和过程,这篇文章就是理论联系实际的典范.并且很多工程师一辈子都不 ...
- 扩展 delphi 泛型 以实现类似lambda功能 , C#中的any count first last 等扩展方法
扩展 delphi 泛型 以实现类似lambda功能 , C#中的any count first last 等扩展方法 在C#中对泛型的扩展,输入参数是泛型本身的内容,返回值则是bool.基于这一点, ...
- Linux命令-dd
dd命令用于指定大小的拷贝的文件或指定转换文件. 以下命令作用:将光驱设备拷贝成镜像文件 参数 if 输入的文件名称 参数 of 输出的文件名称 [root@localhost testA]# dd ...
- Android 广播(内部类)
1.广播定义在一个单独的文件中 源码: public class MessageReceiver extends BroadcastReceiver{ @Override public void on ...
- JSP下载txt 和 Excel两种文件
JSP下载txt 和 Excel两种文件 jsp 下载txt文件和excel文件 jsp 下载txt文件和excel文件 最近做了个用jsp下载的页面 将代码贴出来 权作记录吧 1 下载txt文件 ...
- 基于EntityFramework的权限的配置和验证
1. 概要 本文主要介绍公司现有系统框架的权限体系,和一些待扩展功能的说明.目前该权限体系基于角色构建(RBAC),原则上,系统中不允许出现对用户.组织等其他对象指派权限的情况. 2. 权限分 ...
- [转]matlab如何复制spectrum scope的图
2014-03-17 22:23:01 来自:http://www.ilovematlab.cn/thread-38713-1-1.html 如何将spectrum scope的图复制出来? 解决方法 ...
- flex 组建重写
flex历经几个版本的变化,其封装性也越来越规范. 今日flex的学习,总结是组件的重写. 项目中为使组件的针对性,易用性更强 ,免不了要重写组件. 要改变你的对手你的了解你的对手. 一个组件从被ne ...
- JNI层问题
1. make:进入目录'/opt/FriendlyARM/tiny4412/android/android-4.1.2'make: *** 没有规则可以创建“out/target/product/g ...