序列化之transient关键字
当需要序列化一个对象时,又不想保存该对象的某个属性,这时transient关键字就派上用场了。
以下将演示给Person类的password属性添加transient关键字,然后序列化,再反序列,并对比序列化前后控制台输出的变化。
首先,定义Person类,为了防止密码泄露,给password属性添加transient关键字,表示不要序列化此属性。
public class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private transient String password; public Person(String name, String password){ this.name = name; this.password = password; } @Override public String toString(){ return "Person [name=" + name + ", password=" + password + "]"; } }
然后,在Main方法中创建Person对象,先输出到控制台,用于对比反序列化后的结果。
接着,把Person对象序列化为person文件,然后再读取该文件进行反序列化为Person对象。
最后,在控制台输出反序列化后的Person对象。
public class Main { public static void main(String[] args) { //创建一个Person对象,并序列化到文件 Person person = new Person("alice", "secret"); System.out.println(person.toString()); //序列化 try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("person"))) { outputStream.writeObject(person); } catch (IOException ex) { ex.printStackTrace(); } //反序列化 try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("person"))) { Person newPerson = (Person) inputStream.readObject(); System.out.println(newPerson.toString()); } catch (IOException | ClassNotFoundException ex) { ex.printStackTrace(); } } }
控制台输出如下:
Person [name=alice, password=secret] Person [name=alice, password=null]
通过输出结果可以看到,Person对象的password属性的值“丢了”,被设置为了默认值null。