在上班无事可做时,开始试着自己去看看源码,首先接触不必多说,最为常见的Collection接口下的一些常用类。
打开ArrayList,继承抽象类AbstractList,实现List、RandomAccess、Cloneable、Serializable接口
第一个属性serialVersionUID,不必过多解释,序列化的相关属性
第二个属性elementData,Object数组类型,transient关键字修饰。
transient是什么,从来没见过,好去查一下。
查完回来:transient修饰的属性,不参与序列化,不再是对象持久化的一部分,有transient修饰的属性,类要实现Serializable接口,
下面通过代码去解释这儿
class UserInfo implements Serializable {
private static final long serialVersionUID = 154111313L;
private String userName;
private transient String passWord;
/**
* 获取userName
* @return userName userName
*/
public String getUserName() {
return userName;
}
/**
* 设置userName
* @param userName userName
*/
public void setUserName(String userName) {
this.userName = userName;
}
/**
* 获取passWord
* @return passWord passWord
*/
public String getPassWord() {
return passWord;
}
/**
* 设置passWord
* @param passWord passWord
*/
public void setPassWord(String passWord) {
this.passWord = passWord;
}
}
实体类UserInfo
public static void main(String[] args) {
UserInfo user = new UserInfo();
user.setUserName("Daming");
user.setPassWord("111222333");
System.out.println(user.getUserName() + "/" + user.getPassWord());
try {
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(new File("D:/a.txt")));
os.writeObject(user);
os.flush();
os.flush();
} catch (Exception e) {
// TODO: handle exception
}
try {
ObjectInputStream oi = new ObjectInputStream(new FileInputStream(new File("D:/a.txt")));
UserInfo userCopy = (UserInfo) oi.readObject();
oi.close();
System.out.println(userCopy.getUserName() +"/" + userCopy.getPassWord());
} catch (Exception e) {
// TODO: handle exception
}
}
测试方法如上
测试结果
Daming/111222333
Daming/null
能观察到什么,UserInfo在被序列化后传入文件内,再从文件中读取时为空。我的理解是在对象转化为字节数组时该属性无法序列化,所以值为空,传入文件里也为空。
大致能得到的一个结论是,被transient修饰的属性只能在内存中存活,当对该对象进行持久化操作时,该属性无法被序列化,所以不能保存完整的属性信息。
应用:数据传输安全方面。