百度百科的解释:

        Java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。换句话来说就是,用transient关键字标记的成员变量不参与序列化过程。

作用:
        Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的。

编码试验加以证明:

1.自定义类(为了方便,我直接在main方法所在类中添加的一个静态属性类,或者叫成员类

public static class TransientTest implements Serializable{private static final long serialVersionUID = 233858934995755239L;private String name1;private transient String name2;public TransientTest(String name1,String name2){this.name1 = name1;this.name2 = name2;}public String toString(){return String.format("TransientTest.toString(): name1=%s,name2=%s", name1,name2);}}

2.写一个测试方法

public static void testTransient(){String name1="常规属性",name2="transient修饰的属性";TransientTest test = new TransientTest(name1, name2);System.out.println("序列化前:"+test.toString());ObjectOutputStream outStream;ObjectInputStream inStream;String filePath = "D:/test/object/TransientTest.obj";try {outStream = new ObjectOutputStream(new FileOutputStream(filePath));outStream.writeObject(test);inStream = new ObjectInputStream(new FileInputStream(filePath));TransientTest readObject = (TransientTest)inStream.readObject();System.out.println("序列化后:"+readObject.toString());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

3.在main方法中执行,然后可以看到得到的结果为

印证了上面所讲的“用transient关键字标记的成员变量不参与序列化过程”。

用二进制查看器打开这个文件也可以看到,数据中只有name1,没有name2。(请忽略乱码问题,这个不是重点哈。)

延伸:

在查看JDK源码的时候会发现很多地方都会加上transient关键字来修饰一些属性,那究竟是出于什么考虑才这么做呢?

我觉得,应该是为了节约磁盘空间,避免造成不必要的浪费吧。

以ArrayList中的 transient Object[] elementData 为例,这个成员变量的注释为:

翻译出来就是:

/ * *

*存储ArrayList元素的数组缓冲区。

* ArrayList的容量是这个数组缓冲区的长度。任何

*带有elementData的空ArrayList == DEFAULTCAPACITY_EMPTY_ELEMENTDATA

*当添加第一个元素时,将被扩展到DEFAULT_CAPACITY。

* /

这个缓冲区的容量实际上并不是ArrayList的容量,因为其实际上会预留一些空间,当空间不足时还会扩容,为减少浪费,因此在序列化时不会按照默认算法将这个成员变量写入磁盘。而是写了个writeObject方法,序列化时会调用这个方法将其持久化,在反序列化是,调用readObject,将其恢复出来。

这2个方法为:

参考ArrayList,在上面的TransientTest中添加2个方法,见代码:

public static class TransientTest implements Serializable{private static final long serialVersionUID = 233858934995755239L;private String name1;private transient String name2;public TransientTest(String name1,String name2){this.name1 = name1;this.name2 = name2;}public String toString(){return String.format("TransientTest.toString(): name1=%s,name2=%s", name1,name2);}private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException {s.defaultWriteObject();s.writeObject(name2);}private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException {s.defaultReadObject();name2=String.valueOf(s.readObject());}}

然后在main方法中执行testTransient(),此时得到的结果是:

个人观点,仅供参考,如有不足之处,欢迎批评指正!

关键字transient是干啥的相关推荐

  1. java transient_【转】Java中的关键字 transient

    阅读目录 先解释下Java中的对象序列化 在讨论transient之前,有必要先搞清楚Java中序列化的含义: Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的 ...

  2. java工作笔记020---Java中的关键字 transient

    技术交流QQ群[JAVA,C,.NET,BigData,AI]:170933152 先解释下Java中的对象序列化 在讨论transient之前,有必要先搞清楚Java中序列化的含义: Java中对象 ...

  3. Java基础—序列化关键字transient

    原文作者:老鼠只爱大米 原文地址:Java中transient关键字的详细总结 一.概要介绍 本文要介绍的是Java中的transient关键字,transient是短暂的意思.对于transient ...

  4. Java 关键字 transient

    Java 关键字 transient 转载于:https://www.cnblogs.com/fysola/p/6394626.html

  5. 关于java的关键字 transient

    我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,Java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable ...

  6. java中的关键字transient说明

    这个关键字的作用其实我在写java的序列化机制中曾经写过,不过那时候只是简单地认识,只要其简单的用法,没有深入的去分析.这篇文章就是去深入分析一下transient关键字. 先给出这篇文章的大致脉络 ...

  7. Java关键字transient和volatile小结(转)

    Java关键字transient和volatile小结(转) transient和volatile两个关键字一个用于对象序列化,一个用于线程同步,都是Java中比较高阶的话题,简单总结一下. tran ...

  8. java input是关键字吗_java 关键字transient

    1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过 ...

  9. transient是干嘛的

    Java的serialization提供了一种持久化对象实例的机制.当持久化对象时,可能有一个特殊的对象数据成员,我们不想用 serialization机制来保存它.为了在一个特定对象的一个域上关闭s ...

最新文章

  1. 网站出现service unavailable的解决方法
  2. 华润e万家联手神策数据 多维分析助力精益运营
  3. 原 Ubuntu使用VNC运行基于Docker的桌面系统
  4. 在vue中怎么写行内样式高_说说在 Vue.js 中如何绑定样式(class 或 style)
  5. Spring Boot 之Spring data JPA简介
  6. 变声原理:卷积和传递函数
  7. vue学习笔记之:为何data是一个方法
  8. 轻松搞定个人虚拟桌面部署之4-配置远程访问
  9. 丁磊:网易在元宇宙技术和规划上已经做好准备
  10. android网络配置
  11. 关键词堆砌生成器_网络推广软件的使用和24种关键词挖掘方法
  12. SSD固态硬盘检测工具AS SSD参数
  13. c语言求信源的信息熵,[转载]关于信息熵及信源熵率
  14. java条码扫描_JAVA生成扫描条形码
  15. No matter what,just do not give up。
  16. 顶尖作者介绍 | 心理学领域研究“情绪”的大牛们有哪些?
  17. Python学习20230111
  18. HCL Domino/Notes专业课程和认证体系介绍
  19. 抽象类和抽象方法 abstract类和abstract方法
  20. android 仿微信表情雨下落!

热门文章

  1. 1.JS排序算法之冒泡排序
  2. Linux - 命令的查找(一) which,whereis,locate的用法
  3. 计算机二级上级考试,计算机二级考试题库 二级上级题库2.doc
  4. noip2011 day1
  5. HashMap evict 放逐之旅
  6. 初探Netty:Netty原理、核心组件、数据容器以及运行机制
  7. 工程建筑行业数据治理实践漫谈
  8. 面试--金蝶云之家经验总结
  9. Dlib库基本使用方法
  10. 记一次,1个月前的瓜子二手车面试经历