transient关键字的作用是什么?

一、初识transient关键字

其实这个关键字的作用很好理解,就是简单的一句话:将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化。

概念也很好理解,下面使用代码去验证一下:

1.jpeg

然后我们在Test中去验证一下:

2.jpeg

从上面可以看出,在序列化SerializeUser方法中,首先创建一个序列化user类,然后将其写入到G://Test/template路径中。在反序列化DeSerializeUser方法中,首先创建一个File,然后读取G://Test/template路径中的数据。

这就是序列化和反序列化的基本实现,而且我们看一下结果,也就是被transient关键字修饰的age属性是否被序列化。

3.jpeg

从上面的这张图可以看出,age属性变为了0,说明被transient关键字修饰之后没有被序列化。

二、深入分析transient关键字

为了更加深入的去分析transient关键字,我们需要带着几个问题去解读:

(1)transient底层实现的原理是什么?

(2)被transient关键字修饰过得变量真的不能被序列化嘛?

(3)静态变量能被序列化吗?被transient关键字修饰之后呢?

带着这些问题一个一个来解决:

1、transient底层实现原理是什么?

java的serialization提供了一个非常棒的存储对象状态的机制,说白了serialization就是把对象的状态存储到硬盘上 去,等需要的时候就可以再把它读出来使用。有些时候像银行卡号这些字段是不希望在网络上传输的,transient的作用就是把这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化,意思是transient修饰的age字段,他的生命周期仅仅在内存中,不会被写到磁盘中。

2、被transient关键字修饰过得变量真的不能被序列化嘛?

想要解决这个问题,首先还要再重提一下对象的序列化方式:

Java序列化提供两种方式。

一种是实现Serializable接口

另一种是实现Exteranlizable接口。 需要重写writeExternal和readExternal方法,它的效率比Serializable高一些,并且可以决定哪些属性需要序列化(即使是transient修饰的),但是对大量对象,或者重复对象,则效率低。

从上面的这两种序列化方式,我想你已经看到了,使用Exteranlizable接口实现序列化时,我们自己指定那些属性是需要序列化的,即使是transient修饰的。下面就验证一下

首先我们定义User1类:这个类是被Externalizable接口修饰的

4.jpeg

然后我们就可以测试了

5.jpeg

上面,代码分了两个方法,一个是序列化,一个是反序列化。里面的代码和一开始给出的差不多,只不过,User1里面少了age这个属性。

然后看一下结果:

6.jpeg

结果基本上验证了我们的猜想,也就是说,实现了Externalizable接口,哪一个属性被序列化使我们手动去指定的,即使是transient关键字修饰也不起作用。

3、静态变量能被序列化吗?没被transient关键字修饰之后呢?

这个我可以提前先告诉结果,静态变量是不会被序列化的,即使没有transient关键字修饰。下面去验证一下,然后再解释原因。

首先,在User类中对age属性添加transient关键字和static关键字修饰。

然后,在Test类中去测试

7.jpeg

最后,测试一下,看看结果

8.jpeg

结果已经很明显了。现在解释一下,为什么会是这样,其实在前面已经提到过了。因为静态变量在全局区,本来流里面就没有写入静态变量,我打印静态变量当然会去全局区查找,而我们的序列化是写到磁盘上的,所以JVM查找这个静态变量的值,是从全局区查找的,而不是磁盘上。user.setAge(18);年龄改成18之后,被写到了全局区,其实就是方法区,只不过被所有的线程共享的一块空间。因此可以总结一句话:

静态变量不管是不是transient关键字修饰,都不会被序列化

三、transient关键字总结

java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。像银行卡、密码等等这些数据。这个需要根据业务情况了。


推荐文章
Redis字符串数据结构和常用命令

字符串是Redis最基本的数据结构,它将以一个键和一个值存储于Redis内部,它犹如Java的Map结构,让Redis通过键去找到值。Redis字符串的数据结构如图1所示。 图1  Redis字符

wps设置透明色去除不干净怎么办?

wps设置透明色去除不干净怎么办?下面就一起来看看解决方法吧。1、打开WPS插入图片后,用鼠标点击选中图片,图片的四周出现了8个空心的拖动点。2、在上方的工具栏中选择“图片工具”的选项卡,点击左侧第四

vulkanrt是什么软件?

VulkanRT是一款免费开放的、跨平台的2D和3D绘图应用程序接口(API)软件。拥有标准规范文档、驱动程序、SDK开发包、符合性测试,甚至是测试版的游戏软件支持,一整套解决方案。功能介绍1、Vul

PHP设置时区

时间是生活中必不可少的,在PHP中也是一样,时间有时候要存储起来记录某件事情或者在浏览器中展示出来。 在PHP中是通过日期和时间函数来获取日期和时间的。日期和时间函数依赖于服务器的时间设置,服务器的

URL伪静态化对SEO的影响

无论是普通用户还是搜索引擎都更青睐静态页面,为什么呢?下面我们先了解一下搜索引擎及普通用户获取页面信息的过程。 普通用户 通过浏览器发送指定的URL请求,Web服务器收到请求后定位到指定的文件,或者

Linux Shell管道详解

通过前面的学习,我们已经知道了怎样从文件重定向输入,以及重定向输出到文件。Shell还有一种功能,就是可以将两个或者多个命令(程序或者进程)连接到一起,把一个命令的输出作为下一个命令的输入,以这种方式

Linux GCC简明教程(使用GCC编写C语言程序)

市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核、桌面环境(例如GNOME、KDE、Unity等)和各种常用的必备工具(例如Shell、GCC、VIM、Firefox等)

Linux LANG变量设置:定义系统的主语系环境

LANG变量定义了Linux系统的主语系环境,这个变量的默认值如下: [root@localhostsrc]#echo$LANG zh_CN.UTF-8 这是因为我们在安装Linux时选择的是中文安

浏览器中flash插件被屏蔽怎么办?

最近有很多使用谷歌浏览器的用户在访问网页的时候出现了“该网页已屏蔽以下插件AdobeFlashPlayer”,而且每次访问一个带有flash的新网页都要弹出一次,这该怎么办呢?浏览器中flash插件被

Java接口和抽象类的区别

从前面对面向对象的设计原则的讲解,读者可以了解到,其实所有的设计原则和设计模式都离不开抽象,因为只有抽象才能实现上述设计原则和设计模式。 在Java中,针对抽象有两种实现方式:一种是接口,一种是抽象

一名合格的程序员需要具备哪些技能?

程序世界是一片广阔的大地,相比我十多年前进入这个世界时,这片大地的边界又扩大了很多倍。初入程序世界难免迷茫,要在这个世界立足、生存,并得到很好的发展,应首要具备怎样的技能呢?未来的程序之路,先给自己准

压缩c盘有什么影响?

压缩c盘的影响压缩只能减少占有的空间(大概可以节约15%-20%),它会带来一些其他的缺点:1)C盘有很多系统文件,随意压缩有可能导致系统文件缺损产生各种各样的小毛病。2)压缩后系统启动过程变长了。节

MySQL mysqldump备份数据库(附带实例)

数据库的主要作用就是对数据进行保存和维护,所以备份数据是数据库管理中最常用的操作。为了防止数据库意外崩溃或硬件损伤而导致的数据丢失,数据库系统提供了备份和恢复策略。 保证数据安全的最重要的一个措施就

Dev C++使用教程(使用Dev C++编写C语言程序)

前面我们给出了一段完整的C语言代码,就是在显示器上输出“C语言中文网”,如下所示: #include intmain() { puts("C语言中文网"); return0; } 本节我

Spring saveOrUpdate方法:保存或更新实体对象

该方法可以自动判断是执行实体对象的保存操作还是更新操作。 语法: saveOrUpdate(Objectentity) 参数说明: entity:要保存的实体对象。 示例1 创建一个新用户

hadoop是做什么的?

hadoop是什么?是做什么的?Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hado

小甲鱼WIN32汇编语言视频教程(第二部)(共56讲)

这套教程主要讲解Win32汇编语言,参考书为罗云斌的《琢石成器--Windows环境下的32位汇编语言程序设计》。 学习要求:需要有8086汇编语言的基础知识,懂得基本的汇编语法,可以参考小甲鱼汇编

函数是什么,C语言函数概述

前面说过,学习C语言有两个知识点是必须要学的,一个是函数,另一个是指针,这两个知识点是C语言的主体和核心。由此可见,学习函数的重要性,所以初学者一定要好好学。 什么是函数 第一,函数就是C语言的模块

Unity 3D物理引擎简介

早期的游戏并没有强调物理引擎的应用,当时无论是哪一种游戏,都是用极为简单的计算方式做出相应的运算就算完成物理表现,如超级玛丽和音速小子等游戏。 较为常见的物理处理是在跳跃之后再次落到地上,并没有特别

Linux SRPM包及其应用(超详细)

前面章节介绍了RPM包的安装,现在我们说说SRPM包。 SRPM包是什么呢?SRPM包中的软件不再是经过编译的二进制文件,而是源码文件,所以你可以认为SRPM包是软件以源码形式发布之后,再封装成RP