Từ khoá transient trong java

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

4 3 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x