Java高阶语法---transient
背景:听说transient Java高阶语法是挺进BAT必经之路。
transient:
Java中transient 关键字的作用,简单的说就是让某些被修饰的成员属性变量不被序列化。
这又扯到了序列化和反序列化:
Java中对象的序列化是指将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可以用网络传输;就比如我们使用缓存cache/redis或远程调用RPC(网络传输)如一些密码等不想让人看到的敏感信息的时候,都要让缓存或传输的实体类实现Serializable接口,就是为了序列化实体类。 反序列化:序列化后的终极目的还是反序列化,恢复原先的Java对象,So序列化后的总结序列都是可以恢复为java对象的,此恢复过程就称为反序列化。
具体来说:
1、transient修饰的变量将不再是对象持久化的一部分,此变量内容在序列化后无法获得;
2、transient关键字只能修饰变量,本地变量除外,而不能修饰方法和类;
3、transient修饰的变量不能再被序列化,除此之外静态变量有无transient修饰都不能被序列化;
如下情况可以考虑使用transient关键字修饰:
1、类中的某个字段可以根据其他的字段推导出来,如一个盈利类有三个属性(出售单价、进价、利润),那么在序列化的时候,利润这个属性就没必要序列化了;
2、除此之外,具体看项目的业务需求,哪些字段不想被序列化则用transient 修饰即可;
另外:不序列化还有一个好处,那就是节省内存空间。
写个例子验证下:一个实体类读写流的操作,password用transient修饰,age用static修饰,userName常规操作,序列化实体类执行发现,password无法序列化,age结果值和反序列化之前不一致。

FYI:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import lombok.Data;
import lombok.extern.slf4j.Slf4j; @Slf4j
public class TestTransient {
public static void main(String[] args) throws Exception {
TestTransient.transientTest("tjt", "password666", 22);
}
public static void transientTest(String userName, String password,Integer age) throws Exception {
Account account = new Account();
account.setUserName(userName);
account.setPassword(password);
account.setAge(age);
log.info("before serializeble result is:"+account.getUserName()+"-"+account.getPassword()+"-"+account.getAge());
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(account);
byte[] bytes = byteArrayOutputStream.toByteArray(); // 将account 转为流
account.age = 18; // 在反序列化之前改变age值,结果:反序列化后的结果没有从序列化中取age值
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
ObjectInputStream objectInputStream = null;
objectInputStream = new ObjectInputStream(byteArrayInputStream);
Account accountAfter = (Account) objectInputStream.readObject(); // 从流中获取account
log.info("after serializeble result is:"+accountAfter.getUserName()+"-"+accountAfter.getPassword()+"-"+accountAfter.getAge());
}
@Data
static class Account implements Serializable {
private static final long serialVersionUID = -8994113761711738784L;
private String userName;
private transient String password;
private static Integer age;
public static Integer getAge() {
return age;
}
public static void setAge(Integer age) {
Account.age = age;
}
}
}
执行结果:
- before serializeble result is:tjt-password666-22
- after serializeble result is:tjt-null-18
Java高阶语法---transient的更多相关文章
- Java高阶语法---static
背景:听说static Java高阶语法是挺进BAT必经之路. static: 静态static,很多时候会令我望文生义,但是get到了static最重要的一点,其他的理解都还ok. static最重 ...
- Java高阶语法---Volatile
背景:听说Volatile Java高阶语法亦是挺进BAT的必经之路. Volatile: volatile同步机制又涉及Java内存模型中的可见性.原子性和有序性,恶补基础一波. 可见性: 可见性简 ...
- Java高阶语法---final
背景:听说final Java高阶语法是挺进BAT必经之路. final: final关键字顾名思义就是最终不可改变的. 1.含义:final可以声明成员变量.方法.类和本地变量:一旦将引用声明为fi ...
- Cmd Markdown 高阶语法手册
『Cmd 技术渲染的沙箱页面,点击此处编写自己的文档』 Cmd Markdown 高阶语法手册 1. 内容目录 在段落中填写 [TOC] 以显示全文内容的目录结构. [TOC] 2. 标签分类 在编辑 ...
- Markdown 高阶语法
记录一些 Markdown 的高阶语法,想起来什么,再更新 分割线 两条分割线 *** *** 插入表格 Column Column Column Row Content Content | Colu ...
- Java高阶面试问题合集
下面总结一下在Java面试中常用的一些问题,不具体解答,我只附上一些精彩的博文链接. Spring IOC AOP 底层原理 JAVA的反射机制和动态代理 Java反射机制和动态代理 多线程 Spri ...
- Java高阶回调,回调函数的另一种玩法
工具类package com.sctek; import java.lang.reflect.Field; import android.os.CountDownTimer;import androi ...
- MySQL-5.7 高阶语法及流程控制
1.标签语句 [begin_label:] BEGIN [statement_list] END [end_label] [begin_label:] LOOP statement_list END ...
- Java 高阶 —— try/catch
// try catch 在 for 循环外 try { for(int i = 0; i < max; i++) { String myString = ...; float myNum = ...
随机推荐
- Android 8.1 源码_启动篇(二) -- 深入研究 zygote(转 Android 9.0 分析)
前言 在Android中,zygote是整个系统创建新进程的核心进程.zygote进程在内部会先启动Dalvik虚拟机,继而加载一些必要的系统资源和系统类,最后进入一种监听状态.在之后的运作中,当其他 ...
- Nginx+Keepalived 集群方案
1.Keepalived高可用软件 Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能.因此,kee ...
- Linux上删除大量文件几种方式对比
目录 Linux上删除大量文件几种方式对比 1. rm删除:因为文件数量太多,rm无法删除(报错) 2. find查找删除:-exec 3. find查找删除:xargs 4. find调用-dele ...
- Django解决跨域问题
原理:浏览器的同源策略,其实我们的请求发送过去了,服务器也进行响应了,就是浏览器把响应给阻止响应而已 第一种方法jsonp 因为浏览器不对 <script> 标签里面的src属性进行阻止, ...
- 再谈腾讯云centos服务器不能登录的解决过程
上篇文章谈到腾讯云centos服务器不能登录,通过查看监控信息,cpu使用过高,再腾讯云页面使用VNC方式直接登录,然后根据提示信息,关闭导致内存溢出的进程,从而解决问题. 1 问题再现 昨天刚解决了 ...
- 【我们一起写框架】C#的AOP框架
前言 AOP,大家都是听过的,它是一种面向切面的设计模式. 不过AOP虽然是被称为设计模式,但我们应该很少能看到AOP设计的框架.为什么呢? 因为,AOP单独设计的框架几乎是无法使用的.普遍的情况是, ...
- 边缘计算在物联网(IoT)当中的运用「物联网架构探索系列」
这里记录的是我对物联网架构的学习.探索和思考,希望对你有所启发…… 边缘计算是指在靠近物或数据源头的一侧,采用网络.计算.存储.应用核心能力为一体的开放平台,就近提供最近端服务.其应用程序在边缘侧发起 ...
- DML(数据操纵语言)
1.概念(C) 数据操纵语言 DML (Data Manipulation Langua)是SQL语言的一个分类,用于对表的内容或者说数据进行增.删.改.查等操作. 通过以下几个关键字实现: SELE ...
- 动态路由协议(RIP)
虽然静态路由在某些时刻很有用,但是必须手工配置每条路由条目,对于大中型的网络或拓补经常发生变化的清空,配置和维护静态路由的工作量就变得非常繁重,而且不小心还容易出错,因此就需要一种不需要手工配置的路由 ...
- 同一容器中a标签比较多的情况下通过title属性值隐藏
同一容器中a标签比较多的情况下如何通过title属性值控制a标签的隐藏或显示 最近项目中遇到一个IE兼容性问题,网站需要在底部footer添加"站长统计"代码,容器中动态添加很多a ...