序列化详解

首先要理解一个前提:
Java中的任何对象在脱离内存之后毫无意义。

序列化最终的目的是为了对象可以跨平台存储,和进行网络传输。而我们进行跨平台存储和网络传输的方式就是IO,而我们的IO支持的数据格式就是字节数组。

但是我们单方面的只把对象转成字节数组还不行,因为没有规则的字节数组我们是没办法把对象的本来面目还原回来的,所以我们必须在把对象转成字节数组的时候就制定一种规则(序列化),那么我们从IO流里面读出数据的时候再以这种规则把对象还原回来(反序列化)。

1.什么是序列化

序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象;序列化保存对象转态,不保存静态变量。即把Java对象转换为字节序列的过程。

2.什么是反序列化

把字节序列恢复为Java对象的过程。

3.如何序列化

一个用来标记对象可以序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化。

Java的"对象序列化"能让你将一个实现了Serializable接口的对象转换成一组byte。

序列化只是一种拆装组装对象的规则,那么这种规则肯定也可能有多种多样。

目前JAVA常用的序列化有Protostuff,JSON,XML,Serializable,Hessian,Kryo(不支持跨语言)。

protobuf:谷歌公司出的一款开源项目,转码性能高,支持多语言;

JSON:用途最广泛,序列化方式还衍生了阿里的fastjson,美团的MSON,谷歌的GSON等更加优秀的转码工具。优点:使用方便。缺点:数据冗长,转码性能一般。

4.哪些场景需要序列化(存储、传输)

1.对象序列化可以实现分布式对象。

主要应用例如:RMI(即远程调用Remote Method Invocation)要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。

2.java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。

可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。

3.序列化可以将内存中的类写入文件或数据库中。

比如:将某个类序列化后存为文件,下次读取时只需将文件中的数据反序列化就可以将原先的类还原到内存中。也可以将类序列化为流数据进行传输。总的来说就是将一个已经实例化的类转成文件存储,下次需要实例化的时候只要反序列化即可将类实例化到内存中并保留序列化时类中的所有变量和状态。

4.对象、文件、数据,有许多不同的格式,很难统一传输和保存。

序列化以后就都是字节流了,无论原来是什么东西,都能变成一样的东西,就可以进行通用的格式传输或保存,传输结束以后,要再次使用,就进行反序列化还原,这样对象还是对象,文件还是文件。

备注:如果有人打开过Serializable接口的源码,就会发现,这个接口其实是个空接口,那么这个序列化操作,到底是由谁去实现了呢?其实,看一下接口的注释说明就知道,当我们让实体类实现Serializable接口时,其实是在告诉JVM此类可被序列化,可被默认的序列化机制序列化。

5.为什么实体类要序列化

总结:
只有方法的返回值和参数在进行网络传输,消费者调用方法其实是通过代理类将参数传送到服务提供者那边,然后服务提供执行完方法在将返回值同样传输回来,所以只有参数和返回值在进行网络传输,需要实现序列化接口,所以如果你方法中的参数和返回值中没有实体类,是不需要实现序列化接口的,当然以防万一提前写上序列化接口是个好习惯,值得一提的是java中很多自带的类都默认实现了序列化接口,比如String就是。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值