Java transient 关键字

      Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。   
     transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。

下面是用内部类实现的例子,请大家参考

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.MessageFormat;

/**
 * 
 * ClassName: TestTransinent 
 * @Description: 用java内部类,测试加上transient关键字的成员变量不被序列化
 * @author zhangyan
 * @date 2015-11-30
 */
public class TestTransinent implements java.io.Serializable {
	
	/**
	 * @Fields serialVersionUID : TODO
	 */
	private static final long serialVersionUID = 1L;
	
	class TransientInfo implements java.io.Serializable {
		
		/**
		 * @Fields serialVersionUID : TODO
		 */
		private static final long serialVersionUID = 1L;
		private String name;
		private String age;
		private transient String pwd;//不需要序列号的成员变量
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public String getAge() {
			return age;
		}
		public void setAge(String age) {
			this.age = age;
		}
		public String getPwd() {
			return pwd;
		}
		public void setPwd(String pwd) {
			this.pwd = pwd;
		}

	}

	/**
	 * 
	 * @Title: getTransientInfo
	 * @Description: 在外部类里面创建成员内部类的实例
	 * @param @return   
	 * @return TransientInfo  
	 * @throws
	 * @author zhangyan
	 * @date 2015-11-30
	 */
	public TransientInfo getTransientInfo(){
		System.out.println("在外部类里面创建成员内部类的实例");
		return this.new TransientInfo();
	}

	/**
	 * @Title: main
	 * @Description: TODO
	 * @param @param args   
	 * @return void  
	 * @throws
	 * @author zhangyan
	 * @date 2015-11-30
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TransientInfo info = null;
		//创建内部类实例的两种方法
		//info = new TestTransinent().getTransientInfo();//在外部类里面创建成员内部类的实例
		info = (new TestTransinent()).new TransientInfo();//在外部类之外创建内部类的实例
		info.setName("张三");
		info.setAge("26");
		info.setPwd("123456");
		
		try {
			 //序列化对象
	        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("E:\\TestTransinent.txt"));
	        out.writeObject(info);
	        out.close();
	        System.out.println("TransientInfo对象序列化成功!");
	        
	        //反序列化对象
	        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
	                new File("E:\\TestTransinent.txt")));
	        info = (TransientInfo) ois.readObject();
	        ois.close();
	        System.out.println("TransientInfo对象反序列化成功!");
	        
	        
			System.out.println(MessageFormat.format("name={0},age={1},pwd={2}",
                    info.getName(), info.getAge(), info.getPwd()));//输出结果:name=张三,age=26,pwd=null
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		
	}

}

参考资料
 
 http://www.blogjava.net/fhtdy2004/archive/2009/06/20/286112.html
 http://www.cnblogs.com/mengdd/archive/2013/02/08/2909307.html
 http://www.cnblogs.com/xdp-gacl/p/3777987.html

猜你喜欢

转载自zhang-yan-bj-126-com.iteye.com/blog/2260266
今日推荐