首页 > 编程 > Java > 正文

java中transient关键字学习记录

2019-11-10 20:42:21
字体:
来源:转载
供稿:网友

一、transient关键字的作用

1、为了数据安全,避免序列化和反序列化。

解释:

当对象被序列化时,被transient关键字修饰的变量不会被序列化到目标文件;

当对象从序列化文件重构对象时(反序列化过程),被transient字段修饰的变量不会被恢复。

2、代码解释:详细解释都在注释上写着

注意:运行main函数时,参数添加方式是:点击Run AS->Run  Configurations->Arguments,在 Arguments 的 PRogram arguments 输入IO文件的路径即可

import java.io.DataInputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import org.slf4j.Logger;import org.slf4j.LoggerFactory;class ClassLib implements Serializable {	private static final long serialVersionUID = 78987656781L;	// 这个字段如果用做序列化时,必须要加transient的,不然就会报错(java.io.NotSerializableException),因为InputStream没有实现可序列化的接口	private transient InputStream is;	// 在反序列化时,将无法恢复原来值	private transient int majorVer;	// 以下两个字段加不加 transient关键字都不会参与序列化和反序列化,因为他是类变量	private transient static int minorVer;	private static transient final int sf = 110;	// 当变量被static修饰后,transient就失效了,这也是上线说的因为类变量的原因,被final修饰是起作用的	private final transient Logger log = LoggerFactory.getLogger(ClassLib.class);	private static final ClassLib LIB = new ClassLib();	public ClassLib() {	}	ClassLib(InputStream is) throws IOException {		System.out.println("ClassLib(InputStream) called");		this.is = is;		DataInputStream dis;		if (is instanceof DataInputStream) {			dis = (DataInputStream) is;		} else {			dis = new DataInputStream(is);		}		// 这段代码是参数必须是".class"文件,去掉后就没有此限制了		// if (dis.readInt() != 0xcafebabe) {		// throw new IOException("not a *.class file");		// }		minorVer = dis.readShort();		majorVer = dis.readShort();	}	int getMajorVer() {		return majorVer;	}	int getMinorVer() {		return minorVer;	}	int getSf() {		return sf;	}	Logger getLog() {		return log;	}	ClassLib getLib() {		return LIB;	}	void showIS() {		System.out.println(is);	}}public class TransDemo {	public static void main(String[] args) throws IOException {		if (args.length != 1) {			System.err.println("usage: java TransDemo classfile");			return;		}		ClassLib cl = new ClassLib(new FileInputStream(args[0]));		// 序列化之前的数据显示		System.out.printf("Minor version number: %d%n", cl.getMinorVer());		System.out.printf("Major version number: %d%n", cl.getMajorVer());		System.out.printf("SF version number: %d%n", cl.getSf());		System.out.println("Log " + cl.getLog());		System.out.println("Lib " + cl.getLib());		cl.showIS();		// 开始序列化到 x.ser文件		try (FileOutputStream fos = new FileOutputStream("x.ser");				ObjectOutputStream oos = new ObjectOutputStream(fos)) {			oos.writeObject(cl);		}		cl = null;		// 开始反序列化		try (FileInputStream fis = new FileInputStream("x.ser"); ObjectInputStream ois = new ObjectInputStream(fis)) {			System.out.println();			cl = (ClassLib) ois.readObject();			// 输出反序列化的结果			System.out.printf("Minor version number: %d%n", cl.getMinorVer());			System.out.printf("Major version number: %d%n", cl.getMajorVer());			System.out.printf("SF version number: %d%n", cl.getSf());			System.out.println("Log " + cl.getLog());			System.out.println("Lib " + cl.getLib());			cl.showIS();		} catch (ClassNotFoundException cnfe) {			System.err.println(cnfe.getMessage());		}	}}

知识来源:http://www.importnew.com/12611.html

加入了我个人的理解,如果有错或者别的意见请联系我,一起学习。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表