1,用途

  我们知道,当一个对象实现了Serilizable接口,这个对象就可以被序列化,我们不关心其内在的原理,只需要了解这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。而在开发过程中,我们可能要求:当对象被序列化时(写入字节序列到目标文件)时,有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。 
 所以,transient的用途在于:阻止实例中那些用此关键字声明的变量持久化;当对象被反序列化时(从源文件读取字节序列进行重构),这样的实例变量值不会被持久化和恢复。例如,当反序列化对象——数据流(例如,文件)可能不存在时,原因是你的对象中存在类型为java.io.InputStream的变量,序列化时这些变量引用的输入流无法被打开。

2,使用方法

序列化的时候,将不需要序列化的属性前添加关键字transient即可。 
示例:

<span style="color:#000000"><code><span style="color:#000088">package</span> newDay.day13;<span style="color:#000088">import</span> java.io.FileInputStream;
<span style="color:#000088">import</span> java.io.FileOutputStream;
<span style="color:#000088">import</span> java.io.ObjectInputStream;
<span style="color:#000088">import</span> java.io.ObjectOutputStream;
<span style="color:#000088">import</span> java.io.Serializable;class UserInfo implements Serializable {  <span style="color:#000088">private</span> <span style="color:#000088">static</span> <span style="color:#000088">final</span> <span style="color:#000088">long</span> serialVersionUID = <span style="color:#006666">996890129747019948</span>L;  <span style="color:#000088">private</span> String name;  <span style="color:#000088">private</span> <span style="color:#000088">transient</span> String psw;  <span style="color:#000088">public</span> <span style="color:#009900">UserInfo</span>(String name, String psw) {  <span style="color:#000088">this</span>.name = name;  <span style="color:#000088">this</span>.psw = psw;  }  <span style="color:#000088">public</span> String <span style="color:#009900">toString</span>() {  <span style="color:#000088">return</span> <span style="color:#009900">"name="</span> + name + <span style="color:#009900">", psw="</span> + psw;  }
}
<span style="color:#000088">public</span> <span style="color:#000088">class</span> <span style="color:#4f4f4f">TestTransient</span> {<span style="color:#000088">public</span> <span style="color:#000088">static</span> <span style="color:#000088">void</span> <span style="color:#009900">main</span>(String[] args) {  UserInfo userInfo = <span style="color:#000088">new</span> UserInfo(<span style="color:#009900">"张三"</span>, <span style="color:#009900">"123456"</span>);  System.out.println(userInfo);  <span style="color:#000088">try</span> {  <span style="color:#880000">// 序列化,被设置为transient的属性没有被序列化  </span>ObjectOutputStream o = <span style="color:#000088">new</span> ObjectOutputStream(<span style="color:#000088">new</span> FileOutputStream(<span style="color:#009900">"UserInfo.txt"</span>));  o.writeObject(userInfo);  o.close();  } <span style="color:#000088">catch</span> (Exception e) {  <span style="color:#880000">// TODO: handle exception  </span>e.printStackTrace();  }  <span style="color:#000088">try</span> {  <span style="color:#880000">// 重新读取内容  </span>ObjectInputStream in = <span style="color:#000088">new</span> ObjectInputStream(<span style="color:#000088">new</span> FileInputStream(<span style="color:#009900">"UserInfo.txt"</span>));  UserInfo readUserInfo = (UserInfo) in.readObject();  <span style="color:#880000">//读取后psw的内容为null  </span>System.out.println(readUserInfo.toString());  } <span style="color:#000088">catch</span> (Exception e) {  <span style="color:#880000">// TODO: handle exception  </span>e.printStackTrace();  }  }
}</code></span>

运行结果:

<span style="color:#000000"><code>name=张三, psw=<span style="color:#006666">123456</span>
name=张三, psw=null</code></span>

  密码字段为null,说明被标记为transient的属性在对象被序列化的时候不会被保存。

使用小结:

  1,一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。 
  2,transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。 
  3,被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。 
  对于第三点,加上static之后,依然能把姓名输出。这是因为:反序列化后类中static型变量name的值为当前JVM中对应static变量的值,这个值是JVM中的不是反序列化得出的。下例可说明,其值时JVM中得到的而不是反序列化得到的:

<span style="color:#000000"><code><span style="color:#000088">package</span> newDay.day13;<span style="color:#000088">import</span> java.io.FileInputStream;
<span style="color:#000088">import</span> java.io.FileOutputStream;
<span style="color:#000088">import</span> java.io.ObjectInputStream;
<span style="color:#000088">import</span> java.io.ObjectOutputStream;
<span style="color:#000088">import</span> java.io.Serializable;class UserInfo implements Serializable {  <span style="color:#000088">private</span> <span style="color:#000088">static</span> <span style="color:#000088">final</span> <span style="color:#000088">long</span> serialVersionUID = <span style="color:#006666">996890129747019948</span>L;  <span style="color:#000088">private</span> <span style="color:#000088">static</span> String name;  <span style="color:#000088">private</span> <span style="color:#000088">transient</span> String psw;  <span style="color:#000088">public</span> <span style="color:#009900">UserInfo</span>(String name, String psw) {  <span style="color:#000088">this</span>.name = name;  <span style="color:#000088">this</span>.psw = psw;  }  <span style="color:#000088">public</span> <span style="color:#000088">static</span> String <span style="color:#009900">getName</span>() {<span style="color:#000088">return</span> name;}<span style="color:#000088">public</span> <span style="color:#000088">static</span> <span style="color:#000088">void</span> <span style="color:#009900">setName</span>(String name) {UserInfo.name = name;}<span style="color:#000088">public</span> String <span style="color:#009900">getPsw</span>() {<span style="color:#000088">return</span> psw;}<span style="color:#000088">public</span> <span style="color:#000088">void</span> <span style="color:#009900">setPsw</span>(String psw) {<span style="color:#000088">this</span>.psw = psw;}<span style="color:#000088">public</span> String <span style="color:#009900">toString</span>() {  <span style="color:#000088">return</span> <span style="color:#009900">"name="</span> + name + <span style="color:#009900">", psw="</span> + psw;  }
}
<span style="color:#000088">public</span> <span style="color:#000088">class</span> <span style="color:#4f4f4f">TestTransient</span> {<span style="color:#000088">public</span> <span style="color:#000088">static</span> <span style="color:#000088">void</span> <span style="color:#009900">main</span>(String[] args) {  UserInfo userInfo = <span style="color:#000088">new</span> UserInfo(<span style="color:#009900">"张三"</span>, <span style="color:#009900">"123456"</span>); System.out.println(userInfo);  <span style="color:#000088">try</span> {  <span style="color:#880000">// 序列化,被设置为transient的属性没有被序列化  </span>ObjectOutputStream o = <span style="color:#000088">new</span> ObjectOutputStream(<span style="color:#000088">new</span> FileOutputStream(<span style="color:#009900">"UserInfo.txt"</span>));  o.writeObject(userInfo);  o.close();  } <span style="color:#000088">catch</span> (Exception e) {  <span style="color:#880000">// TODO: handle exception  </span>e.printStackTrace();  }  <span style="color:#000088">try</span> {  <span style="color:#880000">//在反序列化之前改变name的值</span>userInfo.setName(<span style="color:#009900">"hello"</span>);<span style="color:#880000">// 重新读取内容  </span>ObjectInputStream in = <span style="color:#000088">new</span> ObjectInputStream(<span style="color:#000088">new</span> FileInputStream(<span style="color:#009900">"UserInfo.txt"</span>));  UserInfo readUserInfo = (UserInfo) in.readObject();  <span style="color:#880000">//读取后psw的内容为null  </span>System.out.println(readUserInfo.toString());  } <span style="color:#000088">catch</span> (Exception e) {  <span style="color:#880000">// TODO: handle exception  </span>e.printStackTrace();  }  }
}</code></span>

运行结果:

<span style="color:#000000"><code>name=张三, psw=<span style="color:#006666">123456</span>
name=hello, psw=null</code></span>

这说明反序列化后类中static型变量name的值为当前JVM中对应static变量的值,为修改后hello,而不是序列化时的值“张三”

transient的用途及使用方法相关推荐

  1. 地下城php补丁怎么用,地下城与勇士补丁用途及其使用方法详解

    地下城中补丁怎么才能够使用的呢,玩游戏几年了,天天都对着一个图,都有是视觉疲劳了,想换换新花样,那么补丁就来了,能让你每天都感受到不一样的游戏体验,下面来说一说补丁的用途及其使用方法. 在游戏中是不是 ...

  2. iPad和iPhone的app图标尺寸、用途、设置方法

    iPad和iPhone的app图标尺寸.用途.设置方法 下面是在iPhone专用程序.iPad专用程序和通用程序中使用图标文件的指导(由译言网翻译自苹果官方文档,原文http://article.ye ...

  3. 钟表的用途和作用_液体三氯化铁用途及使用方法

    液体三氯化铁为棕色液体.相对密度1.42.易与水混溶,水溶液呈酸性,对金属有氧化腐蚀作用.三氯化铁水溶稀释时,水解后生成氢氧化铁沉淀,有极强凝聚力. 液体三氯化铁用途: 可用饮水的净水剂和废水的处理净 ...

  4. Python中的星号:用途及使用方法(下篇)

    Python中 *和**很常见.无论是对于编程萌新还是许多从其他编程语言(可能无与之完全等效的运算符)迁移过来的的人,这两个运算符有时可能有点儿神秘.在此,我想详述这些运算符的用途及其多种使用方式. ...

  5. Teamviewer被检查成商业用途的解决方法

    个人使用teamviewer的时候,由于被检查成商业用途,导致无法正常使用. 此方法只适用于支持修改MAC地址的网卡 网上搜索 Technitium MAC Address Changer 或者 TM ...

  6. python列表前加星号是什么_Python中的星号:用途及使用方法(1)

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 原作者:Trey Hunner Python中 *和**很常见.无论是对于编程萌新还是许多从其他编程语言( ...

  7. python中星号怎么打出来_Python中的星号:用途及使用方法

    原作者:Trey Hunner Python中 *和**很常见.无论是对于编程萌新还是许多从其他编程语言(可能无与之完全等效的运算符)迁移过来的的人,这两个运算符有时可能有点儿神秘.在此,我想详述这些 ...

  8. 用什么软件测试光纤稳定性,工欲善其事,谈谈光纤的几种常用工具用途及使用方法!...

    随着物联网.5G技术等快速发展,智能化行业中光缆施工和维护的工作逐渐增加,促使各种光纤工具的需求量上升,市面上常见的光纤工具有光纤剥线钳.光缆剥皮器.光缆切割剪等,种类繁多,各种工具的用途也各不相同, ...

  9. ipad分屏功能怎么用_微信支付分有什么用怎么涨分 支付分用途功能提升方法

    [闽南网] 最近,许多用户都在好奇微信支付分是干什么的.许多用户都想知道微信中的支付分有什么用,下面文章小编将为大家介绍微信支付分的用途功能和提升方法. PS:还未开通的朋友请看这条攻略. 微信支付分 ...

最新文章

  1. TF (transform) in ROS
  2. 使用Keras构建具有自定义结构和层次图卷积神经网络(GCNN)
  3. 常用24个方法有效优化ASP.NET的性能
  4. python 读下一行-Python-将前一行和下一行绑定到当前行。
  5. cus.crm.notes.Component.extend(cus.crm.notes.ext.Component, {
  6. 中国速度之二神山建设(3):有力的技术保障,基建世界里的云原生缩影 | IDCF DevOps案例研究...
  7. java 条件 等待_java – 如何唤醒等待相同条件的所有线程?
  8. python计算并返回任意多个整数的和_利用Python的多重处理方法计算一个长输入lin的整数和...
  9. rabbitmq入门-第一讲安装
  10. 编译C++11/14方法
  11. golang slices使用和原理
  12. 学生网页作业:商城网站设计——仿天猫商城(9页) HTML+CSS大作业_ 网页制作作业_疫情防控网页设计...
  13. 数据库中的三种完整性
  14. SDR软件移步BG1ICA.vicp.net:8888
  15. hangfire-快速入门
  16. systemctl理解
  17. 华为无线设备配置静态负载均衡
  18. Linux下查看内存型号、主板、硬盘等等
  19. OneDrive同步任意文件夹
  20. vFlash软件使用说明

热门文章

  1. [转载]危害分析和风险评估(HARA)
  2. ManagementClass,ManagementObject 的使用
  3. crmeb 短信配置相关说明教程
  4. torch.meshgrid函数
  5. 掌握计算机维护搭配动词,我会搭配词语。(脱)衣服(完成)作业()篮球()动物()电脑()房间()麦...
  6. 2021年中国燃气表发展现状及进出口状况分析:随城镇化推进,燃气表市场规模有望扩大 [图]
  7. Hadoop读书笔记(1)
  8. 程序猿里面的“一阳指”,一个合格的程序猿是怎样炼成的?
  9. Java 分布式生成ID—雪花算法
  10. Vue js 实现点击页面空白处隐藏指定div