博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA语言序列化和反序列化
阅读量:2291 次
发布时间:2019-05-09

本文共 6883 字,大约阅读时间需要 22 分钟。

 

 

 

在JAVA中,一个大的应用程序需要保存很多对象的时候,由于虚拟机内存有限,(资源宝贵啊  )有时不可能所有有用的对象都放到内存中,因此,需要将不常用的对象暂时持久化的文件中,当需要这个对象时,再从文件把对象恢复到内存中,这就是所谓对象的序列化和反序列化。本文讲实现如何将对象序列化到文件,然后再从文件反序列化到对象,你会发现其实特别简单

 

先看一下对象的序列化和反序列化的关键是什么

1,首先被序列化的对象必须实现 java.io.Serializable 接口,咳~~咳~~,其实这个接口没定义任何方法

 

2,序列化时,需要用到对象输出流ObjectOutputStream ,然后通过文件输出流构造 ObjectOutputStream 对象调用writeObject写入到文件

 

3,反之,反序列化时用到对象输入流ObjectIntputStream,  然后通过文件输出流构造 ObjectIntputStream对象调用readObject加载到内存,注意,是返回万能Object类型

 

4,注意:序列化时transient变量(这个关键字的作用就是告知JAVA我不可以被序列化)和静态变量不会被序列化(关于静态变量不会序列化保留意见,本实例先不用静态变量)

 

5,也是最应该注意的,如果你先序列化对象A后序列化B,那么在反序列化的时候一定记着JAVA规定先读到的对象是先被序列化的对象,不要先接收对象B,那样会报错

 

好了,现在我们做一个实例,我们现在要序列化一个会员对象到文件里,然后再把它读出来

先创建会员类

 

接着我们开始写如何序列化和反序列化,初学认真看哦

 

 

运行结果:

序列化完毕
今天是:
Thu Oct 23 18:31:11 CST 2008
用户名: renyanwei;密码:888888;年龄:0
反序列化完毕

我们看代码总结一下,serialize方法实现了对象的序列化功能,讲对象序列化到文件,使用了文件的输出流ObjectOutputStream 的writerObject方法一次写入一个对象,对象在文件中按写入顺序存储。

deserialize方法实现反序列化,从文件将对象反序列化到内存,使用了ObjectIntputStream 的readObject方法,因为序列化对象是按照写入顺序存储的,所以在反序列化时必须按照写入顺序读取

大家看了结果就应该知道了,标明transit的实例变量是没被序列化进去的 ,呵呵

 

其实序列化的意义不止如此,不但可以将对象放到文件流,还可以放到网络流里,比如我们做的Socket程序,你不但可以发送给对方一行消息,还可以发送过去一个对象,我估计QQ就不止是把我们的消息发送到对方,应该是一个对象,里面包含了发送者的信息什么的。呵呵 有兴趣的可以做一下哈

 

 

 

 


 

这次我们讲的是控制对象的序列化和反序列化

 

控制序列化就是有选择的序列化对象,而不是把对象的所以内容都序列化,前篇我们的例子中介绍了transit变量和类变量(static)不被序列化,现在我们还有一种更为灵活的控制对象序列化和反序列方法,可以在序列化过程中储存其他非this对象包含的数据

 

我们现在再来介绍一个接口 java.io.Externalizable 。当对象实现了这个接口时,就可以灵活的控制它的序列化和反序列过程,这个接口继承了java.io.Serializable

 

Externalizable 接口定义了两个方法,writerExternal方法在序列化时被调用,可以再该方法中控制序列化内容,readExternal方法在反序列时被调用,可以在该方法中控制反序列的内容

 

好了,现在我们改写上例的UserInfo

 

改写测试类

 

执行结果

现在执行序列化方法
序列化完毕
现在执行反序列化方法
Thu Oct 23 22:18:12 CST 2008
用户名: renyanwei;密码:888888;年龄:0
反序列化完毕

 

通过一张图来看程序流程

首先,我们在序列化UserInfo对象的时候,由于这个类实现了Externalizable 接口,在writeExternal()方法里定义了哪些属性可以序列化,哪些不可以序列化,所以,对象在经过这里就把规定能被序列化的序列化保存文件,不能序列化的不处理,然后在反序列的时候自动调用readExternal()方法,根据序列顺序挨个读取进行反序列,并自动封装成对象返回,然后在测试类接收,就完成了反序列

 

认真体会下程序,相信可以很快理解序列和反序列的操作,有什么没讲明白的大伙儿可以再留言和我讨论, 呵呵 一起提高

 

转载地址:http://nwvnb.baihongyu.com/

你可能感兴趣的文章
python——函数练习(内含腾讯笔试编程题)
查看>>
python:列表生成式,集合生成式
查看>>
python——腾讯-在线编程题(2018)
查看>>
python:列表生成式变型
查看>>
python——os模块
查看>>
Varnish与CDN加速原理
查看>>
Varnish—CDN加速的实现(单个后端服务器)
查看>>
varnish——CDN加速的实现(多个后端服务器实现负载均衡,配置虚拟主机)
查看>>
Varnish——CDN加速的实现(CDN推送平台管理)
查看>>
linux——6.5版本虚拟机的封装与快照
查看>>
LVS的简单介绍以及三种模式的区别
查看>>
LVS模式(一):DR模式(ipvsadm)
查看>>
LVS模式一:DR模式下LVS的健康检查(ldirectord)
查看>>
LVS模式二:TUN隧道模式
查看>>
LVS模式三:NAT网络地址转换模式
查看>>
LVS(DR模式)+Keepalived(高可用)
查看>>
RHCS集群套件(ricci,luci,fence)及高可用性集群
查看>>
RHCS高可用集群下的iscsi共享磁盘与GFS2全局文件系统(实现多点写入)
查看>>
关于nginx的相关知识
查看>>
Nginx——Nginx的基本配置和平滑升级(热部署)
查看>>