一、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
知识来源:http://blog.csdn.net/wohyd/article/details/54922842
加入了我个人的理解,如果有错或者别的意见请联系我,一起学习。