必威体育Betway必威体育官网
当前位置:首页 > IT技术

关键字transient是干啥的

时间:2019-07-29 08:41:07来源:IT技术作者:seo实验室小编阅读:78次「手机版」
 

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(),此时得到的结果是:

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

相关阅读

Go内置关键字分析(一)

Go语言中总共有25个关键字,如下所示:Go关键字按类型不同做如下区分(注:图片来自网络,若有侵权,请联系删除):1. 基本结构类1.1变量与常

C++ explicit关键字详解

首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对

SEO案例:锚文本、关键字、nofollow、Web标准化(一)

前面谈到了做SEO需要注意的好几个因素。但是因为工作上的原因,好多因素没有讲透的。(不过其实有些东西我给我们团队的人都没有讲过

Python关键字keyword

代码版本:3.6.3  关键字 关键字是指Python中的保留字,是已经规定好的有其固定作用的词,定义变量时不能与关键字重名。关键字不是

揭示品牌关键字的重要性的例子

品牌是一种无形资产,为业主提供增值溢价。他的载体是一个与其他竞争对手的产品或服务区别开来的名称、术语、象征、记号或设计及其

分享到:

栏目导航

推荐阅读

热门阅读