今天在牛客网刷题的时候,看到一道题是考trainsient关键字的。惭愧,学了这么久java,还不是很理解这个关键字,虽然在开发中很少遇到它,但却频频出现在面试、笔试题里。
一,transient 瞬态关键字的作用以及方法
众所周知,一个对象实现了Serializable接口就表示这个对象可以被序列化,可以进行网络传输。但是在实际情况中,我们并不想让对象的每个属性都序列化,如用户的密码,银行卡号等。不希望在网络传输(序列化到本地时也使用)中被传输,可以在这些属性前加一个transient 关键字。这样,这个属性就不可以随着对象一起序列化了。当然前提是实现Serializable接口时。
代码示例:
通过ObjectOutputStream和ObjectInputStream来实现序列化与反序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package demo;
import java.io.Serializable;
public class User implements Serializable { private static final long serialVersionUID = -229966308218809522L;
private String username; private transient String password; getset... }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| package demo;
import java.io.*;
public class TestTransient {
public static void main(String[] args) {
User user = new User(); user.setUsername("Yakai"); user.setPassword("123456");
System.err.println("序列化前:"); System.out.println("username: " + user.getUsername()); System.out.println("password: " + user.getPassword());
try { ObjectOutputStream os = new ObjectOutputStream( new FileOutputStream("I:/user.txt")); os.writeObject(user); os.flush(); os.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { ObjectInputStream is = new ObjectInputStream(new FileInputStream( "I:/user.txt")); user = (User) is.readObject(); is.close(); System.err.println("反序列化后: "); System.out.println("username: " + user.getUsername()); System.out.println("password: " + user.getPassword());
} catch (Exception e) { e.printStackTrace(); } } }
|
控制台打印:
1 2 3 4 5 6
| 序列化前: username: Yakai password: 123456 反序列化后: username: Yakai password: null
|
password是null,说明此属性未被序列化到磁盘里。
二,transient关键字使用总结:
通过查阅相关资料:
- 一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
- transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
- 被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。(静态属性存在于内存中)。
- 使用transient 配合Serializable来用。