天天看點

java transient 關鍵字和Serializable接口、Externalizable接口應用場景1:Serializable示例代碼:輸出結果:應用場景2:Externalizable

應用場景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();
        }

    }
}
           

輸出結果:

java transient 關鍵字和Serializable接口、Externalizable接口應用場景1:Serializable示例代碼:輸出結果:應用場景2:Externalizable

可以看到此時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();
        }

    }
}
           

輸出結果:

java transient 關鍵字和Serializable接口、Externalizable接口應用場景1:Serializable示例代碼:輸出結果:應用場景2:Externalizable