阅读目录

先解释下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;

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

举个例子

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

packagetmp;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.Serializable;class Rectangle implementsSerializable{/****/

private static final long serialVersionUID = 1710022455003682613L;privateInteger width;privateInteger height;private transientInteger area;publicRectangle (Integer width, Integer height){this.width =width;this.height =height;this.area = width *height;

}public voidsetArea(){this.area = this.width * this.height;

}

@OverridepublicString 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);returnsb.toString();

}

}public classTransientExample{public static void main(String args[]) throwsException {

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

转载:

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

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

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

  2. Java 主函数 main 中的关键字 static

    相信很多人在运行第一个可以运行的 Java 程序的时候都会要求写一个主函数. 然后很多人都会照葫芦画瓢的写一个下面的函数: public static void main(String[] args) ...

  3. java中的关键字transient说明

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

  4. java static用法_Java中static关键字的作用和用法详细介绍

    static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static ...

  5. java final定义_Java中final关键字的用法

    final在Java中并不常用,然而它却为我们提供了诸如在C语言中定义常量的功能,不仅如此,final还可以让你控制你的成员.方法或者是一个类是否可被覆写或继承等功能,这些特点使final在Java中 ...

  6. java this()函数_java中this关键字的三种用法

    this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. this的用法在java中大体可以分为3种: 1.普通的直接引用,this相当于是指向当前对象本身. 2.形参与成员名字重 ...

  7. java abstract 变量_Java中abstract关键字详解

    abstract只能修饰类(class) 和 方法.而不能修饰成员变量.这是由于抽象的概念确定的.只有类和方法可以抽象出来,而成员变量不需要抽象. abstract修饰类 abstract之所以出现, ...

  8. java搜索文本内容_JAVA 搜索文本文件中的关键字

    原文链接:http://blog..net/blog_abel/article/details/40858245 用JAVA实现对文本文件中的关键字进行搜索, 依据每一行,得到每一行中出现关键词的个数 ...

  9. Java操作itext,寻找给定关键字,并且进行页面抽取和页面盖章两个操作

    案例源代码(已经将其制成工具类,可以直接调用) 链接:https://pan.baidu.com/s/1aQjrJOAmHogRMn8yiyh4Gg  提取码:tl66 背景 业务需要 1.使用打印机 ...

最新文章

  1. TRzCheckTree的使用
  2. win101909要不要更新_win10更新好还是不更新_win10更新有什么用
  3. ubuntu14.04 boost动态库找不到 libboost_system.so.1.58.0
  4. PHP做闹钟APP,8款超好用的闹钟APP,专治各种赖床
  5. Linux中的shell正则表达式详解
  6. ACM常用数列(斐波那契数列、卡特兰数、贝尔数、斯特灵数)
  7. 安装scrapy报错
  8. 2018 CodeM复赛:C. 边的染色
  9. SQL的简单增、删、改
  10. java同步锁有哪几种_Java实现锁的几种方式
  11. HikariPool-1 - Exception during pool initialization. Could not create connection
  12. 漫漫的webim(一) web实现简易im功能
  13. hive编写自定义UDF函数
  14. 磁盘存储链式的B树与B+树
  15. Python Network(三)案例(无向图,有向图,权重,点线分类与大小粗细)
  16. 矩形中分出正方形,递归优化
  17. git branch -f的作用
  18. AIOT核心技术之一--37种传感器超详细介绍
  19. 可以减税 PCA 什么是PostgreSQL
  20. linux服务器怎么安装vbox,在Linux服务器上使用Vbox安装虚拟机

热门文章

  1. OCS 2007 R2将前端加入到企业版池
  2. 【转】上篇:陈皓谈程序员升级:职业规划就像软件工程
  3. 图像处理之opencv图像特效大全
  4. matlab 字符串替换
  5. 视频和视频帧:FFMPEG 硬件解码API介绍
  6. 音视频开发基础概述 - PCM、YUV、H264、常用软件介绍
  7. 恕我直言,90% 的应用场景都不需要用WebAssembly!
  8. 最简单的基于librtmp的示例:接收(RTMP保存为FLV)
  9. 初学C++正则表达式(regex)
  10. il和idl区别_我来给普及一下matlab、IDL、fortran神马的区别吧