java transient 关键字和Serializable接口、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();
        }

    }
}

输出结果:

这里写图片描述
可以看到此时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();
        }

    }
}

输出结果:

这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值