第十一周-序列化

一.对象序列化是什么?

对象总是在运行时存在,当程序终止时,对象也就无论如何也不存在了。而序列化即提供了一种机制,通过将“对象持久化”,可以让对象在程序不运行时也能存在。

二.对象序列化的用途是什么?

  1. java远程方法调用(RMI):可以使得远程对象的像在本机上存在一样。当向远程对象发送消息是,需要通过对象序列化来传出参数和返回值。
  2. Java Beans:使用bean时需要在设计阶段对它的状态信息进行配置。这种状态信息会保存下来,并在程序启动时进行恢复。

三.保存和加载序列化对象

为了保存对象数据,需要打开一个ObjectOutputStream对象:

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("filename"))

为了保存对象,可以直接用ObjectOutputStream 的writeObject方法

Employee harry = new Employee("Harry Hacker",50000,1989,10,1);
out.writeObject(harry);

为了读回对象,首先要获得一个ObjectInputStream对象:

ObjectInputStream in = new ObjectInputStream(new FileInputStream("filename"))

然后,用readObject方法以这些对象写入顺序获取他们:

Employee e1 = (Employee)in.readObject();

注意:保存和加载基本数据类型时,使用基本数据类型对应的方法,如int类型,使用writeInt和readInd。

四.序列化会持久化对象哪些内容?

1.对象序列化不仅保存了对象的“全景图”,而且能追踪对象对所包含的所有引用,并保存那些对象;接着又能对对象内每个引用进行追踪,找到它的引用类,以此类推,形成一个“对象网”。
2.对象序列化是以特殊格式存储对象数据的,如果有兴趣的可以深入了解“对象序列化的文件格式”。这里只做简单介绍:
存储对象时,对象所属类也必须要存储。这个类的描述包括:

  • 类名
  • 序列化的版本唯一ID,他是数据域类型和方法签名的指纹。
  • 描述序列化方法的标志集。
  • 对数据域的描述
    值得注意的点:任何类的完整的类描述符只保存一次,后续描述符将引用它(通过序列化唯一ID)。

五.多对象引用的情况

基于“对象网”特性,如果存在存在多个对象对同一个对象进行引用,如两个经理公用同一个秘书:

Employee harry = new Employee("Harry Hacker",50000,1989,10,1);
Manager carl = new Manager (...);
carl.setSecretary(harry);
Manager tony= new Manager (...);
tony.setSecretary(harry);

这种情况是无法通过保存对象的内存地址来保证秘书是同一个人,因为当对象被重载时,他可能重新占据一块新的地址。
序列化保证每个对象都是用同一个序列号保存。下面是它的算法:

  • 对遇到的每个对象引用都关联一个序列号
  • 对于每个对象,让第一次遇到时,保存其对象数据到输出流中
  • 如果某个对象之前被保存过,那么只写出“与之前保存的序列号为x的对象相同”
    在读回对象时,则是反向操作:
  • 输入流的对象,在第一次遇到其序列号时构建它,并使用流中数据进行初始化,然后记录序列号与对象之间的关联
  • 当遇到“与之前保存的序列号为x的对象相同”标记时,获取与这个序列号相同的引用
    注意:只是同一流中的同一对象会添加“与之前保存的序列号为x的对象相同”标记。不同流时无法保证的。

六.对象序列化的其他方法

上面只介绍了实现Serializable接口的常用序列化方法,序列化包括以下几种方法:

  • 含有writeObject方法的类
  • 实现了Serializable接口的类
  • 实现了Externalizable接口的类

七.屏蔽对象中某些域的方式

有时候我们不希望对象所有的域都被序列化,如用户的密码字段。
这种情况序列化提供了一个transient(瞬时)关键字,通过对对象中的某些不想要序列化的域添加关键字,即可以保证域不被序列化
还有另外一种处理这种情况的方式--使用Externalizable序列化,后续会进行介绍

八.修改默认的序列化机制

通常我们不需要添加额外的方法,Serializable序列化方式就可以自动实现对对象的序列化。但序列化机制也提供了另外一种方式,来屏蔽自动序列化,向默认的读写行为添加验证或其他行为。

private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException;
private void writeObject(ObjectOutputStream in) throws IOException;

通常,在方法的内部我们需要添加defaultWriteObject方法和defaultReadObject方法来保存和加载默认Serializable序列化方式中自动处理的字段(即非transient字段),而对于transient字段,则需要通过writeObject方法和readObject方法来进行保存和加载(是的,你没有看错,transient字段只是无法被默认序列化方式保存和加载)。

九.Externalizable序列化方式

Externalizable序列化方式与Serializable序列化方式的不同点在于:

  1. Externalizable序列化方式不会自动完成序列化,而需要自己定义那些域需要序列化,Externalizable提供了两个方法writeExternalreadExternal,分别显式的保存和加载域。
  2. Externalizable序列化方式会调用构造器。对于Serializable对象,对象完全以它存储的二进制位为基础来构造,而Externalizable对象则会调用所有默认的构造器(包括字段定义时的初始化,如果无法加载出数据,会初始化为null值)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容