欢迎访问优讯网!
您当前的位置:首页 > 爱编程

Java 中对 Serializable 接口和 transient 关键字的理解

时间:2020-01-14 07:55:28  来源:优讯网  作者:小卡司  浏览次数:

首先,我们得知道什么是序列化 (serializable)

众所周知,目前,数据在计算机内存的状态总是趋向于转瞬即逝的(transient),当我们写一段程序,人为的或者非人为的,我们都应将无用的数据从内存里清除。想象以下,当一个十字路口总是挤满各种汽车,那么这个路口的交通状况会变得非常糟糕,清理内存其实是为了提高硬件的工作效率。Java 中的对象序列化是一个用于将对象状态转换为字节流的过程,序列化是为了保持对象在内存中的状态,并且可以把保存的对象状态再读出来。通俗的说,如果堆内存里出现了一个对象,我们想要将此对象长时间保存在类似硬盘的设备上或者通过网络传输到其他计算机上时,就得将此对象序列化,方便我们下次使用,否则过一段时间后,Java 中的垃圾回收机制将会清除内存中的此对象。对象实在是个很抽象的概念,具化到计算机中,只是一堆数据而已,我们习惯用这些数据去描述某个对象(如某个人的姓名、身高、体重等等)。

Serializable 接口是个标识接口

public interface Serializable {
}

看源码后我们知道,这个接口里什么方法都未被定义。若某类的对象需要序列化,则该类应该实现 Serializable 接口

什么时候需要用到序列化?

目前经常碰到的状况基本有以下两种:

1、数据持久化:比如一个电商平台,有数万个用户并发访问的时候会产生数万个 session 对象,这个时候内存的压力是很大的。我们可以把 session 对象序列化到硬盘中,需要时再反序列化,减少内存压力。

2、网络传输:我们将系统拆分成多个服务之后,服务之间传输对象,不管是何种类型的数据,都必须要转成二进制流来传输,接受方收到后再转为数据对象。

transient 关键字

transient 修饰符仅适用于成员变量,不适用于局部变量、方法和类。在序列化时,如果我们不想序列化某个成员变量以满足某些需求(如安全需求),那么应该将该变量声明为 transient 。执行序列化时,JVM 会忽略 transient 变量的初始值并将成员变量的默认值保存到某个文件中。因此,transient 意味着不参与序列化。

transient 和 static、final

Java 中,静态变量不是某类中某个特定对象的具体描述(属性),只有堆内存的数据会参与序列化,而静态变量存放在 datasegment 中,所以它并不参与序列化。将静态变量修饰为 transient 是没有任何作用的(写成 transient static int k 编译时不会报错)。

final 修饰的成员变量一定会参与序列化(还是在堆内存中),所以用 transient 修饰 final 变量不会产生任何影响( transient final int k 编译时不会报错)。

小小总结,到此为止。

来顶一下
返回首页
返回首页

原文链接:https://my.oschina.net/u/3637389/blog/3157934


推荐资讯
如何下载旧版centos iso镜像 如何下载迷你mini版的centos镜像
如何下载旧版centos i
计算机的正确使用姿势 电脑痴如何正确的使用电脑
计算机的正确使用姿势
好用的后台管理的前端框架模版H-ui H-ui框架模版分享
好用的后台管理的前端
微信电脑多开方法 无需辅助电脑版微信双开方法分享
微信电脑多开方法 无
相关文章
栏目更新
栏目热门