應用場景1:Serializable
java 可以使用 Serializable接口來實作對象的可序列化,并且可以使用IO流對其進行操作。
在實作Serializable接口之後,預設是序列化所有的屬性,但是有時有些資訊,我們不想其被序列化,比如銀行卡密碼,如何實作可以選擇性的序列化,就需要transient關鍵字。
比如:
private transient String password;
示例代碼:
import java.io.*;
class Users implements Serializable{
private String username;
private transient String password;
public Users(String username,String password){
this.username=username;
this.password=password;
}
public String getUsername(){
return this.username;
}
public String getPassword(){
return this.password;
}
public String toString(){
return "name="+this.username+" "+"password="+this.password;
}
}
public class ObjectWriteandRead{
public static String ObjectFilename="users.txt";
public static void main(String[]args){
Users user=new Users("Tom","123");
try{
File file=new File(ObjectFilename);
file.createNewFile();
FileOutputStream fileoutputstream = new FileOutputStream(file);
ObjectOutputStream objectoutputstream = new ObjectOutputStream(fileoutputstream);
objectoutputstream.writeObject(user);
objectoutputstream.flush();
objectoutputstream.close();
fileoutputstream.close();
FileInputStream fileinputstream = new FileInputStream(file);
ObjectInputStream objectinputstream = new ObjectInputStream(fileinputstream);
Users userinput = (Users) objectinputstream.readObject();
objectinputstream.close();
fileinputstream.close();
System.out.println(userinput.toString());
}catch(IOException e){
e.printStackTrace();
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
}
輸出結果:

可以看到此時password為null
但是使用了transient關鍵字就一定不能序列化了嗎?
應用場景2:Externalizable
如果在Externalizable接口的 writeExternal和readExternal方法中,手動指定序列化和反序列化屬性則,不管是不是有transient關鍵字,都可以被序列化。
示例代碼:
import java.io.*;
class Users implements Externalizable {
private String username;
private transient String password;
public Users(){
}
public Users(String username,String password){
this.username=username;
this.password=password;
}
public String getUsername(){
return this.username;
}
public String getPassword(){
return this.password;
}
public String toString(){
return "name="+this.username+" "+"password="+this.password;
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(this.username);
out.writeObject(this.password);
System.out.println("自定義序列化過程");
}
@Override
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
this.username= (String) in.readObject();
this.password= (String) in.readObject();
System.out.println("自定義反序列化");
}
}
public class ObjectWriteandRead{
public static String ObjectFilename="users.txt";
public static void main(String[]args){
Users user=new Users("Tom","123");
try{
File file=new File(ObjectFilename);
file.createNewFile();
FileOutputStream fileoutputstream = new FileOutputStream(file);
ObjectOutputStream objectoutputstream = new ObjectOutputStream(fileoutputstream);
objectoutputstream.writeObject(user);
objectoutputstream.flush();
objectoutputstream.close();
fileoutputstream.close();
FileInputStream fileinputstream = new FileInputStream(file);
ObjectInputStream objectinputstream = new ObjectInputStream(fileinputstream);
Users userinput = (Users) objectinputstream.readObject();
objectinputstream.close();
fileinputstream.close();
System.out.println(userinput.toString());
}catch(IOException e){
e.printStackTrace();
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
}