上一篇:深夜看了张一鸣的微博,让我越想越后怕

作者:小丸子的呆地
链接:https://www.jianshu.com/p/db184d3acff8

用transient声明一个实例变量,当对象存储时,它的值不需要维持。

作用

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

验证

package com.qjk;
import java.io.*;
public class TestTransient {static class User implements Serializable {String name;int age;transient int transient_age;String sex;}public static void main(String[] args) throws IOException, ClassNotFoundException {User user = new User();user.age = 12;user.transient_age = 12;user.name = "小丸子";user.sex = "nv";System.out.println("age:" + user.age);System.out.println("transient_age:" + user.transient_age);System.out.println("name:" + user.name);System.out.println("sex:" + user.sex);System.out.println("----------------序列化+反序列化----------------");// 序列化后写入缓存ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(user);oos.flush();oos.close();byte[] buf = baos.toByteArray();// 从缓存中读取并执行反序列化ByteArrayInputStream bais = new ByteArrayInputStream(buf);ObjectInputStream ois = new ObjectInputStream(bais);User u = (User) ois.readObject();System.out.println("age:" + u.age);System.out.println("transient_age:" + u.transient_age);System.out.println("name:" + u.name);System.out.println("sex:" + u.sex);}
}

结果输出

age:12
transient_age:12
name:小丸子
sex:nv
----------------序列化+反序列化----------------
age:12
transient_age:0
name:小丸子
sex:nv

扩展

Exteranlizable

Java序列化提供两种方式。一种是实现Serializable接口。另一种是实现Exteranlizable接口。Externalizable接口是继承于Serializable ,需要重写writeExternal和readExternal方法,它的效率比Serializable高一些,并且可以决定哪些属性需要序列化(即使是transient修饰的),但是对大量对象,或者重复对象,则效率低。

ArrayList中的transient

下面是ArrayList中的一段代码

    /*** ArrayList 的元素存储在其中的数组缓冲区。ArrayList 的容量就是这个数组缓冲* 区的长度。添加第一个元素时,任何带有 elementData == * DEFAULTCAPACITY_EMPTY_ELEMENTDATA 的空 ArrayList 都将扩展为 * DEFAULT_CAPACITY。*/transient Object[] elementData; // non-private to simplify nested class access

ArrayList提供了自定义的wirteObject和readObject方法:

    /*** Save the state of the <tt>ArrayList</tt> instance to a stream (that* is, serialize it).** @serialData The length of the array backing the <tt>ArrayList</tt>*             instance is emitted (int), followed by all of its elements*             (each an <tt>Object</tt>) in the proper order.*/private void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException{// Write out element count, and any hidden stuffint expectedModCount = modCount;s.defaultWriteObject();// Write out size as capacity for behavioural compatibility with clone()s.writeInt(size);// Write out all elements in the proper order.for (int i=0; i<size; i++) {s.writeObject(elementData[i]);}if (modCount != expectedModCount) {throw new ConcurrentModificationException();}}/*** Reconstitute the <tt>ArrayList</tt> instance from a stream (that is,* deserialize it).*/private void readObject(java.io.ObjectInputStream s)throws java.io.IOException, ClassNotFoundException {elementData = EMPTY_ELEMENTDATA;// Read in size, and any hidden stuffs.defaultReadObject();// Read in capacitys.readInt(); // ignoredif (size > 0) {// be like clone(), allocate array based upon size not capacityint capacity = calculateCapacity(elementData, size);SharedSecrets.getJavaOISAccess().checkArray(s, Object[].class, capacity);ensureCapacityInternal(size);Object[] a = elementData;// Read in all elements in the proper order.for (int i=0; i<size; i++) {a[i] = s.readObject();}}}

我理解这里定义elementData为transient是为了防止数据重复被写入磁盘,节省空间。

如果对象声明了readObject和writeObject方法,对象在被序列化的时候会执行对象的readObject和writeObject方法。

静态属性

静态属性,无论是否被transient修饰,都不会被序列化。

感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!小编到你上高速。

· END ·

最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。

正文结束

推荐阅读 ↓↓↓

1.不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

2.如何才能成为优秀的架构师?

3.从零开始搭建创业公司后台技术栈

4.程序员一般可以从什么平台接私活?

5.37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6.IntelliJ IDEA 2019.3 首个最新访问版本发布,新特性抢先看

7.这封“领导痛批95后下属”的邮件,句句扎心!

8.15张图看懂瞎忙和高效的区别!

一个人学习、工作很迷茫?

点击「阅读原文」加入我们的小圈子!

Java关键字transient相关推荐

  1. Java 关键字 transient

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

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

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

  3. java关键字transient和volatile的基本含义和使用方法

    transient transient关键字为类型修饰符,英文本意为"短暂的",在对象序列化过程中,标记了transient的变量不会被序列化. HashMap中的size属性就标 ...

  4. JAVA关键字 transient 学习总结

    transient 意义 transient是相对于 类实现了接口 Serilizable 后拥有的意义. 一般类实现了 Serilizable后使得该类对象可以序列化(个人理解 使得对象以及内部属性 ...

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

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

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

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

  7. java 中 transient关键字

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需 ...

  8. 关于java的关键字 transient

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

  9. Java的transient关键字

    在关于 java的集合类的学习中,我们发现ArrayList类和Vector类都是使用数组实现的,但是在定义数组elementData这个属性时稍有不同,那就是ArrayList使用transient ...

  10. Java之transient关键字

    转自:https://baijiahao.baidu.com/s?id=1636557218432721275&wfr=spider&for=pc 这个关键字的作用其实我在写java的 ...

最新文章

  1. Adversarial Discriminative Domain Adaption 阅读笔记
  2. poj2516 最小费用最大流
  3. matlb中如何设置坐标轴的参数以及进行绘图的如何进行注释
  4. Linux 系统的备份恢复
  5. java并发编程之美-阅读记录5
  6. 语言舒尔特方格程序_有效提升孩子注意力的方法,舒尔特方格训练法,简单有效...
  7. c语言在程序中显示现在星期几,C语言程序设计: 输入年月日 然后输出是星期几...
  8. LeetCode 2208. 将数组和减半的最少操作次数(优先队列)
  9. 开课吧-Java常见面试题:重载和重写的区别?
  10. 问题三十六:ray tracing中的Inverse Mapping(4)——圆柱面Inverse Mapping
  11. android程序员简历模板
  12. Javascript使用turndown 将html 转为md
  13. B站CEO陈睿:我们活跃用户仍维持高增长 动能是独特优质内容
  14. 点击按钮弹出单选列表对话框和加载Webview
  15. pytest合集(5)— Function函数
  16. plotly绘制简单图形4--饼形图
  17. 自动提交flag-python
  18. python金融分析小知识(34)——年化收益率、年化波动率以及夏普比率的计算
  19. 耿丹CS16-2班课堂测试作业汇总
  20. 八核版三星Galaxy S4(I9500)root教程

热门文章

  1. iOS底层探索之Block(三)——Block的本质
  2. 思维导图哪款好用?怎么借助MindManager 做旅游计划
  3. maven-3.5.3通过eclipse打包问题(1)
  4. MariaDB 10.3 解决掉了UPDATE不支持同一张表的子查询更新
  5. oozie JAVA Client 编程提交作业
  6. 美国欲投 2.58 亿美元与中国争夺超算霸主地位
  7. 微信js-sdk集成小结
  8. 编程成长日记——折半查找
  9. Illustrator 教程,如何在 Illustrator 中创建及应用图案?
  10. InDesign 教程,如何创建沉浸式文档?