背景:听说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的更多相关文章

  1. Java高阶语法---static

    背景:听说static Java高阶语法是挺进BAT必经之路. static: 静态static,很多时候会令我望文生义,但是get到了static最重要的一点,其他的理解都还ok. static最重 ...

  2. Java高阶语法---Volatile

    背景:听说Volatile Java高阶语法亦是挺进BAT的必经之路. Volatile: volatile同步机制又涉及Java内存模型中的可见性.原子性和有序性,恶补基础一波. 可见性: 可见性简 ...

  3. Java高阶语法---final

    背景:听说final Java高阶语法是挺进BAT必经之路. final: final关键字顾名思义就是最终不可改变的. 1.含义:final可以声明成员变量.方法.类和本地变量:一旦将引用声明为fi ...

  4. Cmd Markdown 高阶语法手册

    『Cmd 技术渲染的沙箱页面,点击此处编写自己的文档』 Cmd Markdown 高阶语法手册 1. 内容目录 在段落中填写 [TOC] 以显示全文内容的目录结构. [TOC] 2. 标签分类 在编辑 ...

  5. Markdown 高阶语法

    记录一些 Markdown 的高阶语法,想起来什么,再更新 分割线 两条分割线 *** *** 插入表格 Column Column Column Row Content Content | Colu ...

  6. Java高阶面试问题合集

    下面总结一下在Java面试中常用的一些问题,不具体解答,我只附上一些精彩的博文链接. Spring IOC AOP 底层原理 JAVA的反射机制和动态代理 Java反射机制和动态代理 多线程 Spri ...

  7. Java高阶回调,回调函数的另一种玩法

    工具类package com.sctek; import java.lang.reflect.Field; import android.os.CountDownTimer;import androi ...

  8. MySQL-5.7 高阶语法及流程控制

    1.标签语句 [begin_label:] BEGIN [statement_list] END [end_label] [begin_label:] LOOP statement_list END ...

  9. Java 高阶 —— try/catch

    // try catch 在 for 循环外 try { for(int i = 0; i < max; i++) { String myString = ...; float myNum = ...

随机推荐

  1. 《k8s-1.13版本源码分析》-测试环境搭建(k8s-1.13版本单节点环境搭建)

    本文原始地址(gitbook格式):https://farmer-hutao.github.io/k8s-source-code-analysis/prepare/debug-environment. ...

  2. 来聊一聊不low的Linux命令——find、grep、awk、sed

    前几天面试,被一位面试官嫌弃了"你的Linux命令有点low".被嫌弃也挺正常的,因为我的简历写的我自己都有点看不下去:了解Linux常用命令,如ls,tail -f等命令,基本满 ...

  3. Server Error in '/' Application Runtime Error 错误

    项目发布后  在本地发布可以运行  在服务器就会出现这种错误 在网上也查找了各种资料  解决方案 都没有解决 因为我用的C# 首先在 Webconfig配置文件中的 system.web中加入 < ...

  4. SpringBoot整合SpringCloud搭建分布式应用

    什么是SpringCloud? SpringCloud是一个分布式的整体解决方案.SpringCloud为开发者提供了在分布式系统中快速构建的工具,使用SpringCloud可以快速的启动服务或构建应 ...

  5. .net mvc + layui做图片上传(二)—— 使用流上传和下载图片

    摘要:上篇文章写到一种上传图片的方法,其中提到那种方法的局限性,就是上传的文件只能保存在本项目目录下,在其他目录中访问不到该文件.这与浏览器的安全性机制有关,浏览器不允许用户用任意的路径访问服务器上的 ...

  6. 设计模式之桥接模式——Java语言描述

    桥接适用于把抽象化和实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构性模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦 这种模式设计到一个作为桥接的接口,使得实体类的功能独立 ...

  7. The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

    使用EF时,在Limda表达式中( query.Where(x => x.CheckInDate >= bd.Date);)查询的时候抛出了这个异常,网上查到的发现,并不能解决问题. 后来 ...

  8. Spring IOC源码实现流程

    最近一段时间学习了IOC的源码实现,分享一下大概流程 创建一个测试类 代码如下: package com.zcg.learn.Test; import org.junit.Test;import or ...

  9. Win10常见问题记录

    基本信息 记录我在使用win10过程中遇到的一些问题 我所使用的两个win10系统 Win10 企业版 1607(家里电脑) Win10 专业版 1806(公司电脑) win10 开启Sets 请问您 ...

  10. Codeforces Round #539 (Div. 2) - D. Sasha and One More Name(思维)

    Problem   Codeforces Round #539 (Div. 2) - D. Sasha and One More Name Time Limit: 1000 mSec Problem ...