Từ khoá transient được sử dụng để serialization object. Ví dụ như khi chuyển 1 object qua network thì nó phải trải qua quá trình Serialization để chuyển sang dạng serial byte. Những serial byte sau khi đến nơi nhận sẽ được chuyển thành object. Các thuộc tính transient sẽ đánh dấu rằng chúng là các thông tin nội bộ nên sẽ không được chuyển đi bất cứ đâu.
Transient đóng vai trò quan trọng trong bảo mật, bạn có thể sử dụng nó để chắc rằng không lưu các nội dung nhạy cảm xuống file, database hoặc chuyển chúng đến một nơi khác.
Thông thường transient thường đi với private access modifier.
Cú pháp
private transient <member-variable>; // or transient private <member-variable>; // or transient <member-variable>
Ví dụ
import java.io.Serializable; import java.util.Date; class Test implements Serializable { // Mình không muốn lưu password hoặc truyền chúng ra ngoaì private transient String password; /** * Biên age này được tính toán theo công thức currentday - birthday. * Nên đây chỉ là một kết quả tạm thời phục vụ cho code nhanh hơn khỏi * phải đi tính lại age khi cần */ transient int age; // Các biến sẽ được serialize private String username, email; Date dob; }
Transient và static
Trong khi các thành phần static không phải là một trạng thái của object thế nhưng bạn vẫn có thể kết hợp chúng với nhau
private transient static String password;
Transient và final
Final dùng để đánh dấu một biến sẽ giữ một giá trị sau khi được khởi tạo. Thế nhưng chúng ta vẫn sử dụng chung được mà không bị báo lỗi.
transient final int m = 50;
Note:
- Khi sử dụng transient với final hoặc static thì giá trị của chúng vẫn sẽ giữ nguyên sau quá trình serialization và de-serialization.
- Serialization là quá trình chuyển đổi object thành serial byte để truyền đi hoặc lưu file etc.
- De-serialization ngược lại với Serialization dịch các serial byte thành objec.
Ví dụ
import java.io.*; class Test implements Serializable { int i = 124, j = 123; // Transient variables transient int k = 20; // khong bi anh huong boi transient transient static int l = 100; transient final int m = 900; public static void main(String[] args) throws Exception { Test input = new Test(); // serialization FileOutputStream fos = new FileOutputStream("share.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(input); // de-serialization FileInputStream fis = new FileInputStream("share.txt"); ObjectInputStream ois = new ObjectInputStream(fis); Test output = (Test)ois.readObject(); System.out.println("i = " + output.i); System.out.println("j = " + output.j); System.out.println("k = " + output.k); System.out.println("l = " + output.l); System.out.println("m = " + output.m); } }
Output
i = 124
j = 123
k = 0
l = 100
m = 900