transient关键字详解

devtools/2024/10/23 19:29:22/

        今天没打算写blog,在看一篇关于多线程环境下SimpleDateFormat线程不安全的问题,一般我们都知道多线程下这个是不安全,但是为什么不安全不太清楚,我在看的这篇文章讲的比较透彻,我根据文章中讲结合SimpleDateFormat源码简单看了下,发现了里面有些成员变量被transient关键字修饰了,以前还没遇到过这个关键字,就大概了解了下,发现还是比较有用的。现总结下。

      一、简单介绍

        transient是短暂的意思。对于transient 修饰的成员变量,在类的实例对象的序列化处理过程中会被忽略。 因此,transient变量不会贯穿对象的序列化和反序列化,生命周期仅存于调用者的内存中而不会写到磁盘里进行持久化。

        上面讲的在对象序列化过程中,被transient 修饰的成员变量会被忽略。可能大家都知道序列化,就是实体类实现Serializable接口嘛!

        但是什么是序列化呢?具体什么样的操作才是序列化呢?

        Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输。

        说直白点,就是对象在经过各种流(InputStream/OutputStream)传输时会转换为字节。这个过程就是序列化。

        二、transient的作用

        在序列化对象时,对于一些特殊的数据成员(如用户的密码,银行卡号等),为了在传输过程中不传输这些敏感信息,我们不想用序列化机制来保存它。为了在一个特定对象的一个成员变量上关闭序列化,可以在这个成员变量前加上关键字transient

        三、上代码

        实体类:

package com.lsl.exam.entity;import com.baomidou.mybatisplus.annotation.TableName;import java.io.Serializable;@TableName("users")
public class User implements Serializable {private static final long serialVersionUID = 8983061158385445440L;private String userid;private String username;//被transient关键字修饰private transient String userpwd;private String truename;private String classid;public String getUserid() {return userid;}public void setUserid(String userid) {this.userid = userid;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getUserpwd() {return userpwd;}public void setUserpwd(String userpwd) {this.userpwd = userpwd;}public String getTruename() {return truename;}public void setTruename(String truename) {this.truename = truename;}public String getClassid() {return classid;}public void setClassid(String classid) {this.classid = classid;}@Overridepublic String toString() {return "User{" +"userid='" + userid + '\'' +", username='" + username + '\'' +", userpwd='" + userpwd + '\'' +", truename='" + truename + '\'' +", classid='" + classid + '\'' +'}';}
}

测试类:

package com.lsl.exam.utils;import com.lsl.exam.entity.User;import java.io.*;public class SdfTest {public static void main(String[] args) {User user = new User();user.setClassid("1");user.setUserid("001");user.setUsername("小明");user.setUserpwd("123456");user.setTruename("王小明");System.out.println("序列化前username="+ user.getUsername());System.out.println("序列化前userpwd="+ user.getUserpwd());try {ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("d:/aa.txt"));//将user对象写入aa.txtos.writeObject(user);os.flush();os.close();} catch (Exception e) {e.printStackTrace();}try {ObjectInputStream in = new ObjectInputStream(new FileInputStream("d:/aa.txt"));User uu = (User) in.readObject();in.close();System.err.println("返序列化后username=" + uu.getUsername());System.err.println("返序列化后userpwd=" + uu.getUserpwd());} catch (Exception e) {e.printStackTrace();}}
}

输出结果:

四、总结

1、一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法被访问。
 
2、transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
 
3、一个静态变量不管是否被transient修饰,均不能被序列化(如果反序列化后类中static变量还有值,则值为当前JVM中对应static变量的值)。序列化保存的是对象状态,静态变量保存的是类状态,因此序列化并不保存静态变量。


http://www.ppmy.cn/devtools/128226.html

相关文章

WebRTC音频 03 - 实时通信框架

WebRTC音频01 - 设备管理 WebRTC音频 02 - Windows平台设备管理 WebRTC音频 03 - 实时通信框架(本文) WebRTC音频 04 - 关键类 WebRTC音频 05 - 音频采集编码 一、前言: 前面介绍了音频设备管理,并且以windows平台为例子,介绍了ADM相关的类…

python3的基本数据类型:Number(数字)

一. 简介 本文简单学习一下 python3的一个数据类型:Number(数字)。 数字用于存储数值,python支持整型,浮点型,复数与分数。 二. python3基本数 据类型:Number(数字)…

word下宏命令添加右键菜单调用大语言模型

word开发者模式下,直接选visual basic,把代码粘贴进去,CrateSelectedTextWithAI()函数下把apikey换成你自己的密钥,我这个密钥不可用。这里调用的是月之暗面的模型(有一定免费额度),其他模型的没…

前端工具函数库

流行的前端工具函数库 lodashlodash-es:用lodash-es代替lodashes-toolkit:https://www.npmjs.com/package/es-toolkitradash:https://github.com/sodiray/radash 补充信息: antd-mobile 已不再依赖 lodash, 淘汰 lo…

前端性能优化之加载篇

前端页面加载的过程其实跟我们常常提起的浏览器页面渲染流程几乎一致: 网络请求,服务端返回 HTML 内容。 浏览器一边解析 HTML,一边进行页面渲染。 解析到外部资源,会发起 HTTP 请求获取,加载 Javascript 代码时会暂停页面渲染。 根据业务代码加载过程,会分别进入页面开始…

Golang | Leetcode Golang题解之第494题目标和

题目&#xff1a; 题解&#xff1a; func findTargetSumWays(nums []int, target int) int {sum : 0for _, v : range nums {sum v}diff : sum - targetif diff < 0 || diff%2 1 {return 0}neg : diff / 2dp : make([]int, neg1)dp[0] 1for _, num : range nums {for j …

【Next.js 项目实战系列】05-删除 Issue

原文链接 CSDN 的排版/样式可能有问题&#xff0c;去我的博客查看原文系列吧&#xff0c;觉得有用的话&#xff0c;给我的库点个star&#xff0c;关注一下吧 上一篇【Next.js 项目实战系列】04-修改 Issue 删除 Issue 添加删除 Button​ 本节代码链接 这里我们主要关注布局…

1.DBeaver连接hive数据库

1.hive开启远程服务&#xff0c;linux中直接输入&#xff1a;hiveserver2 2.解压dbeaver和hive-jdbc-2.1.1.zip 3.双击打开 4.数据库&#xff0c;新建连接 5.搜索hive 6.配置参数 7.编辑驱动设置 8.添加jar包 9.测试连接 10.右击&#xff0c;新建sql编辑器 11.执行sql 12.调整字…