Java transient 关键字是干啥的

百度百科的解释:

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 block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.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(),此时得到的结果是:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java transient关键字与序列化操作实例详解

    本文实例讲述了Java transient关键字与序列化操作.分享给大家供大家参考,具体如下: 一 介绍 transient关键字不会进行JVM虚拟机的序列化,但也可以自己进行序列化,要用到下面两个函数.这两个函数来自ArrayList源码,可以分析ArrayList源码的序列化和反序列化问题.这样做可以对有效元素进行序列化,不对无效元素进行序列化,以提高网络传输性能. private void writeObject(java.io.ObjectOutputStream s)throws ja

  • 说一说java关键字final和transient

    首先,说说final. final关键字可以修饰变量,方法,类. final变量: 需求: 1 需要一个永不改变的编译时常量 2 一个运行时被初始化的值,不希望被更改 好处:编译时就执行的计算,减轻运行时的负担 扩展: 可以修饰基本类型和引用对象.修饰基本类型的时候,表示数值很定不变.修饰对象引用的时候,一旦引用被初始化指向一个对象,就无法再将它更改指向另一个对象(该对象本身是可以修改的) 空白final final修饰但又没有给出初始值的域 必须在域的的定义或构造器内用表达式给final赋值(

  • Java transient 关键字详解及实例代码

    Java transient 关键字 1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化. 然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见

  • Java中的transient关键字介绍

    transient说明一个属性是临时的,不会被序列化. 下面是一个Demo,name声明为 transient,不被序列化 package com.zzs.tet; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.

  • Java transient关键字使用小记

    哎,虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关于这个的,于是花个时间整理下transient关键字的使用,涨下姿势~~~好了,废话不多说,下面开始:  1. transient的作用及使用方法        我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了

  • java中transient关键字用法分析

    本文实例分析了java中transient关键字用法.分享给大家供大家参考.具体分析如下: java有个特点就是序列化,简单地来说就是可以将这个类存储在物理空间(当然还是以文件的形式存在),那么当你从本地还原这个文件时,你可以将它转换为它本身.这可以极大地方便网络上的一些操作,但同时,因为涉及到安全问题,所以并不希望把类里面所有的东西都能存储(因为那样,别人可以通过序列化知道类里面的内容),那么我们就可以用上transient这个关键字,它的意思是临时的,即不会随类一起序列化到本地,所以当还原后

  • Java transient 关键字是干啥的

    百度百科的解释: Java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.换句话来说就是,用transient关键字标记的成员变量不参与序列化过程. 作用: Java的serialization提供了一种持久化对象实例的机制.当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它.为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient.当一个对象被序列化的时

  • Java transient关键字原理解析

    这篇文章主要介绍了Java transient关键字原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Java 中的 transient 关键字被用来表示变量将不被序列化处理.那么在理解 transient 关键字之前,我们先了解下什么是序列化. 什么是序列化 序列化是对象进行持久化处理,也就是说,将对象转化成一个字节流进行存储(比如存储为一个字节文件)或传输(通过网络传输字节).同时,我们也可以从字节中反序列化一个对象出来.这是Java

  • Java的关键字与保留字小结

    JAVA常用关键字及其用法简要说明 Abstract: 抽象的 一个Java语言中的关键字,用在类的声明中来指明一个类是不能被实例化的,但是可以被其它类继承.一个抽象类可以使用抽象方法,抽象方法不需要实现,但是需要在子类中被实现 break: 一个Java的关键字,用来改变程序执行流程,立刻从当前语句的下一句开始执行从.如果后面跟有一个标签,则从标签对应的地方开始执行 case: Java语言的关键字,用来定义一组分支选择,如果某个值和switch中给出的值一样,就会从该分支开始执行. catc

  • 一篇文章带你了解Java之关键字和保留字

    目录 引言 概念 关键字分类 1.访问控制 2.类.方法和变量修饰符 3.程序控制语句 4.错误处理 5包相关 6.基本类型 7.变量引用 8.保留关键字 9.其他(个人认为不是关键字.也不是保留字,但是,如果尝试将它们用作Java中的标识符,仍然会生成编译时错误.) 总结 引言 ♀ 小AD:小明哥,前几天边学Java边学连招,我感觉上分如喝水,我这连招很熟练哦. ♂ 明世隐:跟明哥混,舒服吧! ♀ 小AD:舒服啊,回头请你喝奶茶! ♂ 明世隐:乖,懂事! ♀ 小AD:那今天整点啥? ♂ 明世隐

  • Java的关键字与标识符小结

    本文总结了Java的关键字与标识符.分享给大家供大家参考,具体如下: 相关内容: 关键字: 定义 特点 用于定义数据类型的关键字 用于定义流程控制的关键字 用于定义访问权限修饰符的关键字 用于定义类,函数,变量修饰符的关键字 用于定义类,函数,变量修饰符的关键字 用于定义类与类之间的关系的关键字 用于定义建立实例及引用实例,判断实例的关键字 用于异常处理的关键字 用于包的关键字 其他关键字 JAVA标识符: 定义 组成规则 常见的命名规则 包 类和接口 方法.变量 常量 首发时间:2017-06

  • Java enum关键字不识别的快速解决办法

    从别人那儿拷贝过来的myeclipse java工程,打开一看标红了一大片,仔细一看,原来是不识别enum关键字,这就有点尴尬了. 我自己重新建了一个java工程,测试了下,假如我在新建工程的时候选择JavaSE-1.6: 是识别enum关键字的,但是假如我选择第二个或者默认的jdk1.8,那就不行了,后来发现java compiler compliance level中的最高上限也才1.7,所以,两种解决方法(原理是一样的),一是将compiler compliance level设置到1.5

随机推荐