Hướng Dẫn Thực Hiện Persistence Với Java Serialization

Cơ Chế Lưu Trữ Và Trao Đổi Đối Tượng

Khi xây dựng các ứng dụng phức tạp, nhu cầu lưu giữ trạng thái của đối tượng vào đĩa hoặc truyền tải chúng qua mạng lưới là phổ biến. Để thực hiện được điều này, kỹ thuật chuyển đổi đối tượng thành chuỗi bit nhị phân được gọi là Serialisation sẽ giải quyết vấn đề.

Ngược lại, quá trình khôi phục lại đối tượng từ chuỗi byte đó gọi là Deserialisation. Hai thao tác chính thường dùng để xử lý dòng vào ra bao gồm:

  • Serialise: Ghi đối tượng vào luồng đầu ra bằng phương thức writeObject().
  • De-serialise: Đọc lại đối tượng từ luồng đầu vào bằng phương thức readObject().

Lưu ý quan trọng: Các biến tĩnh (static variables) sẽ không được lưu trữ trong quá trình này. Lý do là cơ chế serialization tập trung vào việc bảo toàn trạng thái của từng instance, trong khi biến tĩnh mang tính chất chung cho toàn bộ class.

Giao Diện Đánh Dấu Serializable

Để một lớp có khả năng thực hiện serialisation, nó bắt buộc phải triển khai giao diện java.io.Serializable. Giao diện này là một giao diện trống (marker interface), nghĩa là không chứa bất kỳ phương thức bắt buộc nào. Tuy nhiên, nếu cố gắng xử lý một đối tượng chưa triển khai interface này, JVM sẽ ném ra ngoại lệ NotSerializableException.

// Minh họa quy trình ghi và đọc đối tượng xuống file
public class ObjectPersistenceUtil {
    public static void main(String[] args) {
        String storagePath = "user_profile.bin";
        
        // Thực hiện ghi dữ liệu
        saveUserProfile(storagePath);
        // Thực hiện đọc dữ liệu
        loadUserProfile(storagePath);
    }

    private static void saveUserProfile(String filePath) throws Exception {
        UserInfo userInfo = new UserInfo("Minh", 25);
        
        // Tạo luồng ghi đối tượng xuống tệp tin
        FileOutputStream fos = new FileOutputStream(filePath);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        
        oos.writeObject(userInfo);
        oos.close();
        fos.close();
    }

    private static void loadUserProfile(String filePath) throws Exception {
        FileInputStream fis = new FileInputStream(filePath);
        ObjectInputStream ois = new ObjectInputStream(fis);
        
        // Lấy lại đối tượng từ luồng nhị phân
        UserInfo userLoaded = (UserInfo) ois.readObject();
        System.out.println(userLoaded.toString());
        
        ois.close();
        fis.close();
    }
    
    // Định nghĩa lớp thông tin người dùng cần serializable
    private static class UserInfo implements java.io.Serializable {
        private String name;
        private int age;

        public UserInfo(String name, int age) {
            this.name = name;
            this.age = age;
        }

        @Override
        public String toString() {
            return "Name: " + name + ", Age: " + age;
        }
    }
}

Kết quả chạy chương trình sẽ hiển thị:

Name: Minh, Age: 25

Vai Trò Của Từ Khóa transient

Từ khóa transient cho phép lập trình viên loại bỏ khỏi danh sách các trường cần lưu trữ trong quá trình serialization. Điều này hữu ích khi dữ liệu có thể tính toán lại hoặc không cần thiết phải lưu bền vững.

Một ví dụ điển hình là mảng elementData bên trong lớp ArrayList. Mảng này sử dụng transient vì dung lượng cấp phát có thể lớn hơn số lượng phần tử thực tế. Do đó, chỉ lưu phần dữ liệu thực sự đang được sử dụng mới tối ưu hóa được kích thước file.

private static class UserInfo implements java.io.Serializable {
    private String name;
    private transient int secretCode; // Trường này sẽ bị bỏ qua khi serialize

    public UserInfo(String name, int secretCode) {
        this.name = name;
        this.secretCode = secretCode;
    }
    
    // Getter/Setters omitted for brevity
    
    @Override
    public String toString() {
        return "Name: " + name + ", SecretCode: " + secretCode;
    }
}

Sau khi thực hiện de-serialise giá trị của secretCode sẽ trở về mặc định null hoặc 0 (đối với primitives), thay vì giữ nguyên giá trị cũ.

Thẻ: java-io Serialization transient-modifier persistent-storage

Đăng vào ngày 25 tháng 10 lúc 16:50