transient关键字

      最近在维护系统代码时,发现了变量修饰符transient,这在我以前的项目开发中没有用过。在提及仅仅包含数据的java对象时,最先想到的是PO,VO等。

      PO(persistant object) 持久化对象,一般和数据库中的表映射的java对象,在使用Hibernate框架时,常常会直接利用编译器生成PO。而VO(value object) 值对象,通常用在业务逻辑层,对应业务对象。

      PO和VO的使用目的是为了降低各层之间的耦合,但是每次都进行二者之间的转换,也是比较麻烦的。考虑到这些,transient似乎起到了微妙的作用,修饰某业务变量时,进行序列化时不必传送此变量。出于安全等考虑角度,在实际项目经验中,对象需要序列化到数据库、JDNI或通过Object流传递给其他对象的话,对象中的非持久性字段也应该考虑加transient关键字。

transient的测试例子:

 

import java.io.*;

public class TransientTest {

	public static void main(String[] args) {
		User user = new User("Suky","qwe123");
		System.out.println("name:"+user.getName());//name:Suky
		System.out.println("pwd:"+user.getPassword());//pwd:qwe123
		
		try {
			ObjectOutputStream obj = new ObjectOutputStream(new FileOutputStream("transientOUT.text"));
			obj.writeObject(user);
			obj.close();
			
			ObjectInputStream in = new ObjectInputStream(new FileInputStream("transientOUT.text"));
			User user2 = (User)in.readObject();
			in.close();
			System.out.println("name2:"+user2.getName());//name2:Suky
			System.out.println("pwd2:"+user2.getPassword());//pwd2:null
			
			//测试读出实例,不会执行构造函数
			ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("transientOUT.text"));
			output.writeObject(new User());
			output.close();
			
			ObjectInputStream input = new ObjectInputStream(new FileInputStream("transientOUT.text"));
			User user3 = (User)input.readObject();
			input.close();
			System.out.println("name3:"+user3.getName());//name3:Test
			System.out.println("pwd3:"+user3.getPassword());//pwd3:null
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

class User implements java.io.Serializable{

	private static final long serialVersionUID = 1L;
	private String name;
	private  String password;//transient
	
	User(){
		this.name = "Test";
		this.password = "123456";
	}
	User(String name,String password){
		this.name = name;
		this.password = password;
	}
	
	public String getName() {return name;}
	public void setName(String name) {this.name = name;}
	public String getPassword() {return password;}
	public void setPassword(String password) {this.password = password;}
	
}
 

你可能感兴趣的:(Hibernate,框架)