1、开门见山
transient使其修饰的变量不可被反序列化(有例外↓)
2、序列化接口目前已知有Serializable和Externlizable
①Serializable:在实现了此接口的类中,若有transient修饰的变量,其可被序列化,
但无法被反序列化,即可存储,无法读取
package test.test2;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* @description 测试Serializable与Externalizable接口
* @author bb
* @date 2018年11月11日 上午7:39:24
*/
public class Transient implements Serializable {
//序列化必须写出的ID
private static final long serialVersionUID = 7254873036673977917L;
//测试字符串
private transient String content = "无敌bb";
//测试数字
private transient int i = 6666;
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
//声明对象
Transient t = new Transient();
//写入对象
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("src/test/test2/test.dat"));
out.writeObject(t);
out.close();
//读取对象
ObjectInput in = new ObjectInputStream(new FileInputStream("src/test/test2/test.dat"));
t = (Transient)in.readObject();
in.close();
//打印
System.out.println(t);
}
@Override
public String toString() {
return content + " " + i;
}
}
②Externlizable:在实现了此接口的类中,若有transient修饰的变量,其可被序列化,
也可被反序列化,需实现此接口中的两个方法(readExternal、writeExternal)
package test.test2;
import java.io.Externalizable;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* @description 测试Externalizable接口
* @author bb
* @date 2018年11月11日 上午7:39:24
*/
public class Transient implements Externalizable {
//序列号
private static final long serialVersionUID = 7254873036673977917L;
//测试字符串
private transient String content = "无敌bb";
//测试数字
private transient int i = 6666;
@Override
public void writeExternal(ObjectOutput out) throws IOException {}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {}
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
//声明对象
Transient t = new Transient();
//写入
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("src/test/test2/test.dat"));
out.writeObject(t);
out.close();
//读取
ObjectInput in = new ObjectInputStream(new FileInputStream("src/test/test2/test.dat"));
t = (Transient)in.readObject();//读
in.close();
System.out.println(t);
}
@Override
public String toString() {
return content + " " + i;
}
}
3、注意:
①transient只能修饰变量
②用final或static修饰的变量,即使被transient修饰,也可以反序列化(在Serializable中)
这就是目前个人对transient的简单理解,以后若了解更深,会再次更新!!!!!