transient的作用及用法
java的网络编程中,要想使对象再网络中传输,就必须实现一Serializable接口.这个对象就可以被序列化,使对象在网络中传输.(经常问道的面试题),正是这种序列化的模式,使对象在网络传输方便了许多,至于内部的原理,可以去看源码. 在传输后制定解码方式,可以是对象重新出现在本地内存中.
而对于安全性较高的字段,我们一般不希望在网络中传输,所以transient关键字就可以使该字段,属性不再在网络中进行传输
我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。
示例代码
User实例
public class User implements Serializable {
private String name;
private transient String password;
public User(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
建立网络连接客户端
public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 1119);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
User user=new User("Tom","12345");
System.out.println(user.getName()+"---"+user.getPassword());
oos.writeObject(user);
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
建立网络连接的服务端
public class MyServer {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(1119);
Socket accept = ss.accept();
ObjectInputStream ois = new ObjectInputStream(accept.getInputStream());
User user = (User) ois.readObject();
System.out.println(user.getName()+"--- after tranisented :password= "+user.getPassword());
accept.close();
ss.close();
} catch (Exception e) {
e.printStackTrace();
}finally {
}
}
}
最后的结果:
我们可以发现:被transient修饰的属性,是不能在网络中进行传输的 值为null