java transient 关键字和Serializable接口、Externalizable接口

来源:互联网 发布:网络玄学是什么意思 编辑:程序博客网 时间:2024/05/21 14:49

应用场景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 0
原创粉丝点击