transient关键字

一、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

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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值