阅读目录

  • 先解释下Java中的对象序列化
  • 关于transient关键字
  • 举个例子
  • 参考资料

先解释下Java中的对象序列化

在讨论transient之前,有必要先搞清楚Java中序列化的含义;

Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输,一般当我们使用缓存cache(内存空间不够有可能会本地存储到硬盘)或远程调用rpc(网络传输)的时候,经常需要让我们的实体类实现Serializable接口,目的就是为了让其可序列化。

当然,序列化后的最终目的是为了反序列化,恢复成原先的Java对象,要不然序列化后干嘛呢,所以序列化后的字节序列都是可以恢复成Java对象的,这个过程就是反序列化。

关于transient关键字

Java中transient关键字的作用,简单地说,就是让某些被修饰的成员属性变量不被序列化,这一看好像很好理解,就是不被序列化,那么什么情况下,一个对象的某些字段不需要被序列化呢?如果有如下情况,可以考虑使用关键字transient修饰:

1、类中的字段值可以根据其它字段推导出来,如一个长方形类有三个属性:长度、宽度、面积(示例而已,一般不会这样设计),那么在序列化的时候,面积这个属性就没必要被序列化了;

2、其它,看具体业务需求吧,哪些字段不想被序列化;

PS,记得之前看HashMap源码的时候,发现有个字段是用transient修饰的,我觉得还是有道理的,确实没必要对这个modCount字段进行序列化,因为没有意义,modCount主要用于判断HashMap是否被修改(像put、remove操作的时候,modCount都会自增),对于这种变量,一开始可以为任何值,0当然也是可以(new出来、反序列化出来、或者克隆clone出来的时候都是为0的),没必要持久化其值。

    /*** The number of times this HashMap has been structurally modified* Structural modifications are those that change the number of mappings in* the HashMap or otherwise modify its internal structure (e.g.,* rehash).  This field is used to make iterators on Collection-views of* the HashMap fail-fast.  (See ConcurrentModificationException).*/transient int modCount;

最后,为什么要不被序列化呢,主要是为了节省存储空间,其它的感觉没啥好处,可能还有坏处(有些字段可能需要重新计算,初始化什么的),总的来说,利大于弊。

举个例子

仅仅是示例,具体使用请根据实际情况:

package tmp;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;class Rectangle implements Serializable{/****/private static final long serialVersionUID = 1710022455003682613L;private Integer width;private Integer height;private transient Integer area;public Rectangle (Integer width, Integer height){this.width = width;this.height = height;this.area = width * height;}public void setArea(){this.area = this.width * this.height;}@Overridepublic String toString(){StringBuffer sb = new StringBuffer(40);sb.append("width : ");sb.append(this.width);sb.append("\nheight : ");sb.append(this.height);sb.append("\narea : ");sb.append(this.area);return sb.toString();}
}public class TransientExample{public static void main(String args[]) throws Exception {Rectangle rectangle = new Rectangle(3,4);System.out.println("1.原始对象\n"+rectangle);ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("rectangle"));// 往流写入对象
        o.writeObject(rectangle);o.close();// 从流读取对象ObjectInputStream in = new ObjectInputStream(new FileInputStream("rectangle"));Rectangle rectangle1 = (Rectangle)in.readObject();System.out.println("2.反序列化后的对象\n"+rectangle1);rectangle1.setArea();System.out.println("3.恢复成原始对象\n"+rectangle1);in.close();}
}

结果打印(达到目的,节省存储空间,成功恢复成原始对象):

1.原始对象
width : 3
height : 4
area : 12
2.反序列化后的对象
width : 3
height : 4
area : null
3.恢复成原始对象
width : 3
height : 4
area : 12

转载:

https://www.cnblogs.com/chenpi/p/6185773.html

转载于:https://www.cnblogs.com/day1day1up/p/11213298.html

【转】Java中的关键字 transient相关推荐

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

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

  2. java中的关键字transient说明

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

  3. [转载] Java中的关键字含义以及介绍

    参考链接: C++和Java中static关键字的比较 Java关键字是有特别意义的标识符.用来表示一种数据类型,或者表示程序的结构等. Java关键字不能用作变量名.方法名.类名.包名和参数. 以下 ...

  4. java中的关键字英汉

    java中的关键字 初入java记录贴 类: enum(枚举).interface(接口).class(类).extends(继承).implements(实现接口) 对象: new(创建).inst ...

  5. 【Java_基础】Java中Native关键字的作用

    本篇博文转载与:Java中Native关键字的作用 转载于:https://www.cnblogs.com/leiblog/p/10529056.html

  6. java中final关键字的使用

    final 中文翻译为 最终的,在java中也是较为常用的关键字之一. 在java 中 final 关键字可以修饰  类.方法.变量 final 修饰在类上,则表示该类不能被继承,如果里面的成员变量没 ...

  7. java中的关键字static

    原文链接: https://zhuanlan.zhihu.com/p/70110497 昨晚面试中被问到,没能回答出来.这篇答疑文章写得非常好,无一字可增删,遂直接复制. 在平时开发当中,我们经常会遇 ...

  8. java 死锁 内存消耗_详解Java中synchronized关键字的死锁和内存占用问题

    先看一段synchronized 的详解: synchronized 是 java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并 ...

  9. java中的关键字:this与super 大详解

    文章目录 1.this 1.1. this是什么? 1.2 this调用对象中的属性.构造器和方法 2.super 2.1 super是什么? 2.2 super调用父类的属性.构造器.方法 3. t ...

  10. 4.Java中的关键字和标识符

    关键字 1.被Java语言赋予特定含义的单词即为关键字,组成规则:字母全部都是小写   2. 保留字:即它们在Java现有版本中没有特殊含义,以后版本可能会作为有特殊含义的词,如 goto,  con ...

最新文章

  1. 「技术综述」一文道尽传统图像降噪方法
  2. 单片机I/O口推挽输出与开漏输出的区别
  3. FFT和Matlab中操作FFT
  4. SQL Server 重置Identity标识列的值(INT爆了)
  5. Android 监听耳机的插拔事件
  6. android 振动传感器,Android光线传感器
  7. DT大数据 scala for查询
  8. 大数据系统架构是什么
  9. 使用cmake和vs2019进行编译libtorch过程
  10. conan入门(六):conanfile.txt conanfile.py的区别
  11. python定义结构体_python中定义结构体的方法
  12. ROS之launch文件解析
  13. Git恢复已删除文件
  14. 基于threejs,完成一个简单的全景图播放器
  15. java的抽象方法和抽象类
  16. VScode CMake 编写 Boost Asio Chat程序----记录6
  17. 《留美秘籍:专家教你上美国名校》一二、选择最适合自己的学校
  18. 美式看跌期权的二叉树定价
  19. 落单的数(落单的数 落单的数 II 落单的数 III)
  20. 形式语言与自动机基础

热门文章

  1. java.lang.UnsatisfiedLinkError: Library not loaded: @rpath/libo.dylib Reason: image not found
  2. LINUX使用OpenSSL进行签名
  3. 解决办法:std没有成员initializer_list
  4. VS2010编译:_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
  5. 保留正常工作的环境,等自己的搞好后再替换
  6. VirtualBox中,WIN虚拟机与WIN共享文件夹
  7. guid linux 识别的分区表_Linux开机流程详解:BIOSgt;MBRgt;GRUBgt;Kernel
  8. php 忽略加载动态某个目录,php – 如何使用RecursiveIteratorIterator忽略目录?
  9. 如何用python编写操作系统_操作系统介绍、python基础
  10. java invokevirtual_Java | 深入理解方法调用的本质(含重载与重写区别)