村长 发表于 2021-8-28 23:19:29

【FX】Java基础知识|序列化与反序列化


http://cdn.u1.huluxia.com/g4/M01/C2/2C/rBAAdmDDasGAGJCJAAKA6rfdhHk700.jpg
一、基本概念
1、序列化和反序列化定义
Java序列化是指把Java对象转换为字节序列的过程。

Java反序列化是指把字节序列恢复为Java对象的过程。

2、序列化和反序列化的作用
(1)序列化作用
在传递和保存对象时,保存对象的完整性和可传递性。
对象转换为有序字节流,可以在网络上传输或者保存在本地文件(一般json/xml文件居多)中。

(2)反序列化作用
根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。http://cdn.u1.huluxia.com/g4/M01/C2/2C/rBAAdmDDasGALny5AAJsAOsvc5o073.jpg
二、序列化和反序列化的优缺点
1、优点
(1)将对象转为字节流存储到硬盘上,当JVM停机的时候,字节流还会在硬盘上等待,等待下一次JVM启动,把序列化的对象,通过反序列化转为原来的对象,并且序列化的二进制序列能够减少存储空间(永久性保存对象)。

(2)序列化为字节流形式的对象可以进行网络传输(二进制形式)。

(3)通过序列化可以在进程间传递对象。

2、缺点
(1)无法跨语言
无法跨语言是Java序列化最致命的问题。

对于跨进程的服务调用,服务提供者可能是Java之外的其它语言,当我们需要和其它语言交互时,Java序列化就难以胜任。

事实上,目前几乎所有流行的Java RPC通信框架,都没有使用Java序列化作为编解码框架,原因就是它无法跨语言,而这些RPC框架往往需要支持跨语言调用。
【RPC通信框架在一楼】
(2)序列化后流的长度比通过缓冲区处理要大的多。
(3)序列化性能太低
三、序列化使用场景
1、分布式传递对象,或者网络传输,需要序列化

2、我调用你的jvm的方法,结果返回到我的jvm上进行处理

3、序列化可以保持对象的状态
比如:tomcat关闭以后会把session对象序列化到SESSIONS.ser文件中,等下次启动的时候就把这些session再加载到内存里面来。

4、数据传输并复原

在j2ee中页面与后台使用的比较多。尤其是在列表中的时候使用尤为突出。

比如:一个人员的列表保存起来的话,你可以将这个列表序列化,传到后台,然后再反序列化成person对象直接进行对象的保存。

5、比如EJB远程调用 分布式存储,缓存存储等

6、像银行卡、密码这些字段不能被序列化

四、序列化和反序列化的注意事项
1、Java序列化的方式
实现 Serializable 接口:可以自定义 writeObject、readObject、writeReplace、readResolve 方法,会通过反射调用。

实现 Externalizable 接口:需要实现 writeExternal 和 readExternal 方法。

2、序列化ID问题
虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致(就是 private static final long serialVersionUID = 1L)。

3、静态字段不会序列化
序列化时不保存静态变量,这是因为序列化保存的是对象的状态,静态变量属于类的状态,因此序列化并不保存静态变量。

4、transient
transient代表对象的临时数据。

如果你不想让对象中的某个成员被序列化可以在定义它的时候加上 transient 关键字进行修饰,这样,在对象被序列化时其就不会被序列化。

transient 修饰过的成员反序列化后将赋予默认值,即 0 或 null。

有些时候像银行卡号这些字段是不希望在网络上传输的,transient的作用就是把这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。

5、父类的序列化
当一个父类实现序列化,子类自动实现序列化;而子类实现了 Serializable 接口,父类也需要实现Serializable 接口。

6、当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化
7、并非所有的对象都可以序列化
(1)安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行RMI传输等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的;

(2)资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分配,而且,也是没有必要这样实现;

8、序列化解决深拷贝问题
如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存,这是能用序列化解决深拷贝的重要原因。

半度微凉 发表于 2021-8-30 09:30:06

LZ敢整点更有创意的不?兄弟们等着围观捏~

梦影 发表于 2021-8-30 09:34:33

看帖要回,回帖才健康,在踩踩,楼主辛苦了!

天镜盗梦 发表于 2021-8-31 06:36:52

打酱油的人拉,回复下赚取积分

伴我多久 发表于 2021-9-1 15:18:29

围观 围观 沙发在哪里!!!

neige 发表于 2021-9-2 17:39:27

回个帖子,下班咯~
页: [1]
查看完整版本: 【FX】Java基础知识|序列化与反序列化

村长黑科技是专业提供项目资源的服务的村长黑科技平台,如合购网赚项目、引流推广软件、软件程序开发等项目就选村长黑科
技平台参与或发布项目定制各种软件就来村长黑科技平台

本站中所有被研究的素材与信息全部来源于互联网,版权争议与本站无关。本站所发布的任何软件的破解分析文章、破解分析视频、补丁、注册机和注册信息,

仅限用于学习和研究软件安全的目的。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。学习破解分析技术是为了更好的完善软件可能存在的不安全因素,提升软件安全意识。所以您如果喜欢某程序,

请购买注册正版软件,获得正版优质服务!不允许将上述内容私自传播、销售或者其他任何非法用途!否则,产生任何法律责任,一切后果请用户自负,与本网站无关!如有侵权或非法用途请举报!请发送到邮箱:cxphj8@foxmail.com

《意见反馈》或《截图指定页面备注》发送到邮件,收到后24小时内删除,禁止用户学习使用关掉用户【学习使用权】!