网站首页 > 技术文章 正文
往期文章
「快学springboot」在springboot中写单元测试「Java并发编程」谈谈Java中的内存模型JMM面试官:说说你知道多少种线程池拒绝策略
前言
之前写过一篇序列化相关的文章,今天要讲的这个文件自transient也是跟序列化有关系的。但是,挺多人没有了解过该关键字甚至是不知道该关键字的存在。
transient关键字介绍
在Java中,当一个类实现了java.io.Serializable接口,即表明了该类可以被序列化。我们可以把该类的属性序列化然后保存在外部,或者跟另外一个jvm进行数据传递。但是,我们是否想过,如果一个类包含隐私信息,如用户的密码等,那么这个属性就不能够被序列化到外部。当然,我们可以在序列化之前手动set该值为null,但是最优雅的做法就是使用transient关键字。
在我们不想序列化到外部的属性前面加上transient关键字,该属性将不会被序列化。
代码测试
假设我们有User对象如下:
@Data public class User implements Serializable { ? private String username; ? private transient String password; ? }
通过序列化工具类序列化和反序列化:
@Test public void test() { User user = new User(); user.setUsername("happyjava"); user.setPassword("123456"); System.out.println("序列化之前:" + user.toString()); byte[] serialize = SerializationUtils.serialize(user); User newUser = SerializationUtils.deserialize(serialize); System.out.println("反序列化:" + newUser); }
运行结果如下:
通过结果可以看到,反序列化之后没有存在password字段,这反向的证明了序列化的时候没有把password参与到序列化中去。这正是transient关键字的用处。
静态属性序列化问题
可能有读者会想到,如果静态属性加上transient会怎么样?反序列化回来之后是不是该类的静态属性就编程null了?下面通过代码来验证下:
给User添加属性count:
private transient static int count;
这是一个静态属性。
先把该属性设置为10,然后序列化、反序列化一个类,再查看该静态属性:
@Test public void test() { User user = new User(); User.setCount(10); user.setUsername("happyjava"); user.setPassword("123456"); System.out.println("序列化之前:" + user.toString()); System.out.println("user count:"+User.getCount()); byte[] serialize = SerializationUtils.serialize(user); User newUser = SerializationUtils.deserialize(serialize); System.out.println("反序列化:" + newUser); System.out.println("user count:" + User.getCount()); }
输出结果如下:
从结果看,静态属性没有发生改变。其实,不管有没有加transient关键字,静态属性都不会被序列化。
总结
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分。
2)transient关键字只能修饰变量,而不能修饰方法和类。
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
猜你喜欢
- 2024-10-01 3W 字详解 Java 集合 3w+字详解+java+集合使用
- 2024-10-01 一次线上故障:数据库连接池泄露后的思考
- 2024-10-01 听说这四个概念,很多Java老手都说不清,你能分得清么?
- 2024-10-01 JPA Transient示例 jpa truncate
- 2024-10-01 Java序列化和反序列化 java序列化和反序列化错误的是
- 2024-10-01 12张图带你彻底理解Java中的各种锁
- 2024-10-01 Java 从入门到放弃(二):修饰符 java中的修饰符有哪些?
- 2024-10-01 你真的以为你了解Java的序列化了吗?
- 2024-10-01 字节码混淆:实现Java字节码加密的实战解析
- 2024-10-01 你知道Transient 关键字吗? nastran关键字帮助文档
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)