Java中transient关键字的应用

今天跟JDK源码的时候发现transient ,感觉从来没见过,于是用google查了一下.

Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。

下面我们查创建一个LoginFile的类:

public class LoginFile implements Serializable{
	private static final long serialVersionUID = 1L;
	private String name = null;
	private transient String pwd = null;

	public LoginFile() {
		name = "shirdey";
		pwd = "654321";
	}
	public String toString(){
		return "ClassName:LoginFile"
				+"\nname = "+name
				+"\npwd = "+pwd;
	}
}

然后初始化LoginFile对象,将该对象写到硬盘上:

LoginFile loginFile = new LoginFile();
	System.out.println(loginFile.toString());
	try {
	   ObjectOutputStream outputStream = new ObjectOutputStream (new FileOutputStream("login.out"));
	outputStream.writeObject(loginFile);
	   outputStream.close();
	} catch (FileNotFoundException e) {
	   e.printStackTrace();
	}

此时打开login.out文件看不到pwd字段没,然后我们通过读取login.out测试一下:

try {
	ObjectInputStream inputStream  = new ObjectInputStream(new FileInputStream("login.out"));
	LoginFile loginFile = (LoginFile) inputStream.readObject();
	System.out.println(loginFile.toString());
	} catch (Exception e) {
	}

output:

ClassName:LoginFile
name = shirdey
pwd = null

很明显,被transient修改的pwd字段并没有被保存在硬盘

当串行化某个对象时,如果该对象的某个变量是transient,那么这个变量不会被串行化进去。也就是说,假设某个类的成员变量是transient,那么当通过ObjectOutputStream把这个类的某个实例保存到磁盘上时,实际上transient变量的值是不会保存的。因为当从磁盘中读出这个对象的时候,对象的该变量会没有被赋值。

另外这篇文章还提到,当从磁盘中读出某个类的实例时,实际上并不会执行这个类的构造函数,而是读取这个类的实例的状态,并且把这个状态付给这个类的对象。这点我以前似乎不知道。

参考文献:http://www.devx.com/tips/Tip/13726

Java中transient关键字的应用

时间: 2024-10-08 20:04:47

Java中transient关键字的应用的相关文章

java 中 transient 关键字意义

译文出处:Why does Java have transient variables? java 中的 transient 关键字表明了 transient 变量不应该被序列化(transient). 参考Java Language Specification, Java SE 7 Edition, Section 8.3.1.3. transient Fields: 被 transient 标记的这些变量,表明他们是某个对象中不需要被持久状态的部分(Variables may be mark

Java中的关键字 transient

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

Java中的关键字/保留字

Java关键字是Java语言保留供内部使用的,如class用于定义类. 关键字也可以称为保留字,它们的意思是一样的,我们不能使用关键字作为变量名或方法名. 表2-1 Java中的关键字/保留字 abstract assert boolean break byte case catch char class const continue default do double else extends final finally float for goto if implements import

转:java中volatile关键字的含义

转:java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制. synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用 sync

java中的关键字static(静态变量)和final定义常量

1 package point; 2 3 class Point { 4 5 int x = 0; 6 int y = 0; 7 static int z = 100; // 定义静态变量z,类变量 8 static final double PI = 3.1415926;// final定义常量,它的值在运行时不能被改变 9 10 Point(int a, int b) { 11 //PI=3.1415926; 12 /* 13 * 当使用静态常量的时候,不能在构造函数中初始化, 因为静态时,

Java中this关键字的使用

Java中this关键字的使用主要有两处: 1.构造方法 this指的是调用构造方法进行初始化的对象. //有参构造 public Human(String name, int age) { this(); //调用无参构造 //this(name); //调用有参构造(参数为name的构造方法) this.name = name; this.age= age; } 2.普通方法(非静态方法) this指的是调用该方法的对象. //普通方法 public void setName(String

Java复习笔记--java中this 关键字

Java中this关键字,this可以调用类的成员变量和成员方法,this还可以调用类中的构造方法.使用这种方式值得注意的是, 只可以在无参构造方法中的第一句使用this关键字调用有参构造方法. public class AnyThting{ public AnyThting(){ this("this 调用有参构造方法"); System.out.println("无参构造方法"); } public AnyThting(String name){ System.

java中static关键字总结

Java中,static关键字一般情况下有四种用法: 用来修饰一个变量. 用来修饰一个方法. 用来修饰一个内部类. 用来修饰一段代码块. 1 public class Student{ 2 String name; 3 static int count;//static修饰的变量 4 static{//static修饰的代码块 5 count=0; 6 } 7 public static void playGame(){//static修饰的方法 8 System.out.println("我爱

Java中native关键字

Java中native关键字 标签: Java 2016-08-17 11:44 54551人阅读 评论(0) 顶(23453) 收藏(33546) 今日在hibernate源代码中遇到了native关键词,甚是陌生,就查了点资料,对native是什么东西有了那么一点了解,并做一小记. native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中.Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言